Python说文解字_杂谈05

1. isinstance和type:

  is和==符号,is指的是内存地址,是不是一个对象,ID知否相同

  集成链

class A:
    pass

class B(A):
    pass

b = B()
print(isinstance(b,B))
print(isinstance(b,A))

print(type(b) is B)
print(id(type(b)),id(B))
# 2943616512536 2943616512536

2. 类变量和对象变量:

  类中的self == 实例,其实就等于a = A()的a,等于传递进去,这就是为什么类中有self的原因。

class A:
    aa = 1
    def __init__(self,x,y):
        self.x = x
        self.y = y


a = A(2,3)
A.aa = 11
a.aa = 100
print(a.x,a.y,a.aa)
# 2 3 1
print(A.aa)
# print(A.x,A.y) # 抛异常

# 2 3 100
# 11

  记住:查找的顺序是由下而上进行查找

  记住:类变量只能通过类来更改,如果通过实例去更改,只会开辟一块儿新的变量,类的变量其实不能更改,但是看起来是一个变量。类的变量是所有成员共享的。

3. 类属性和实例属性的查找顺序:

  定义在内部的实例或者方法。

  查找分深度查找和广度查找,其实前面有类名.__init__这样继承父类的方式就是深度查找,我们Py3用的是MRO算法,用的是C3,super()就是一种C3的查找方法。

class A:
    name = "A"
    def __init__(self):
        self.name = "obj"

a = A()
print(a.name)
# 会打印obj回不到name变量

  

class D:
    pass

class C(D):
    pass

class B(D):
    pass

class A(B,C):
    pass

print(A.__mro__)
# (<class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.D'>, <class 'object'>)

  记住:可以用__MRO__查看继承链的关系。

  记住:py2,必须要写object才有object,py3.不用写也会继承object,是一种新式类

4. 静态方法、类方法、对象方法(实例方法):

  

  

猜你喜欢

转载自www.cnblogs.com/noah0532/p/10987522.html
今日推荐