Python——类的__class__属性与isinstance函数的用法


不同文件为入口文件时

1
2
3
4
5
6
7
8
# file: fruit.py

class Apple:
def __init__(self):
name = "HongFuShi"

apple = Apple()
print apple.__class__
1
2
# file: run.py
import fruit
  • 考虑一个文件名为fruit.py的文件夹中定义了一个类Apple,同时初始化一个对象apple
    • 若执行python fruit.py: 输入”main.Apple”
    • 若将当前文件导入到另一个文件run.py中,然后执行python run.py: 输出”fruit.Apple”
    • 也就是说,执行不同文件,类Apple的前缀不同

isinstance的困境

1
2
3
4
5
6
7
8
9
10
11
12
# file: fruit.py
class Apple(object):
pass


if __name__ == "__main__":
from run import get_apple
apple1 = Apple()
print apple1.__class__
apple2 = get_apple()
print apple2.__class__
print isinstance(apple2, Apple)
1
2
3
4
5
6
7
8
# file: run.py
from fruit import Apple


def get_apple():
apple = Apple()
print apple.__class__
return apple
  • 此时执行python run.py, 无任何输出

  • 若执行python fruit.py, 则输出如下:

    1
    2
    3
    4
    <class '__main__.Apple'>
    <class 'fruit.Apple'>
    <class 'fruit.Apple'>
    False
    • 此时fruit.py是程序的入口文件
    • 在入口文件中执行apple1 = Apple()后得到的类将是__main__.Apple
    • 在入口文件被导入到run.py文件中后,执行apple2 = Apple()后得到的类将是fruit.Apple
    • 此时,由于apple2的类别是fruit.AppleApplefruit.py中是__main__.Apple,造成isinstance(apple2, Apple)返回False
    • isinstance的困境: 看起来是同一个类,但执行isinstance后返回False