Python 中的类与元类
定义
对象是 Python 中对数据的一种抽象, Python 程序中所有数据都是通过对象或者对象之间的关系来表示。
组成
对象是一个盛有数据的盒子,只不过除了纯粹的数据之外,所有的对象都具有id、type、value三个属性。
- id 代表内存地址
- type 代表对象的类别
分类
- 可以用来生成新对象的类,包括内置的
int
/str
以及自己定义的函数。 - 由类生成的实例对象
- 生成类的类,即元类。所有类都继承自 Type
super
在单继承中以下的操作没问题
super().method() #python3
super(fatherClass, self).method() #python2
super 也可以在类的外面使用。用来调用某个类的父类方法.
super(C,C()).method
完整例子:
class A:
def method(self):
print("A.method")
class B(A):
def method(self):
print("B.method")
class C(B):
def method(self):
print("C.method")
class D(C):
def __init__(self):
super().method()
super(__class__, self).method()
super(C, self).method()
super(B, self).method()
super(B, C()).method()
多重继承下使用 super
class A:
def test(self):
print("Aaaaa")
class B:
def test(self):
print("Baaaa")
class C(A, B):
def test1(self):
super().test()
在这种情况下,super().test()
会输出什么?
在多重继承父类有重名的情况下,python 会按照 c3 算法来进行排序,这个顺序可以从这查看:
print(C.__mro__)
(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)
python 会按照这个顺序查找,如果排在前面的方法含有这个方法,就会采用这个方法。这种方法叫做本地优先。这种算法也是新式类的重要特征,旧式类是深度优先的。
如果想更加明了的使用B.test,可以这样写
class C(A, B):
def test1(self):
B.test(self)
一个重要的意识,super和父类没有啥直接必然的联系!
super 的使用场景
什么时候使用super()?
当子类和父类都定义了构造函数__init__
的时候,子类的__init__
会把父类的方法覆盖掉。在子类中使用super调用父类的构造函数。
class a:
def __init__(self):
pass
def t(self):
print(1)
class b(a):
def __init__(self):
super().__init__()
def t(self):
print('b')
多重继承的问题
我对 super 的理解不准确,这个问题一定要解决一下。
http://www.cnblogs.com/bettermanlu/archive/2011/07/27/2118394.html
mro
mro 是 Method Resolution Order 的缩写,mro() 是一个类方法,可以用来查看类的查找顺序。
d = D()
print(D.mro())
type
class A:
pass
print(type(A)) # <class 'type'>
类对象都是由元类产生的。type 是所有类对象的对象。
class 定义类的语法实际上转化为 type(name, base, dict)
,其中 name
参数为类的名字,bases
为继承父类的元组,dict
为类的属性和方法。
# 上面的 class A 等价于:
B = type('A', (), {})
在生成实例时先调用 __new__
方法用于创建实例,再通过调用 __init__
方法进行初始化。
在 enum.Enum
的定义中,由于枚举类型是单例模式,因此在定义 __new__
的时候没有返回其实例,也就不会进行初始化:
class Enum:
def __new__(cls, *kwg, **kwargs):
print(cls, *kwg)
return cls
def __init__(self):
print("Will not be called")
if __name__ == '__main__':
e = Enum(1)
print(e)
上一篇: 枚举类enum中的values( )方法
下一篇: Python中的元类