学习 Python 的类型模型和类语句协议。 class 语句在末尾自动调用 type() 以创建类对象并分配类名。
python3.在 x 中,用户定义的类对象是名为 type 的对象的实例,而 type 本身就是一个类;
python2.x,现代类继承自对象,对象是类型的子类;传统类是类型的实例;
type() 内置函数返回任何对象的类型。
顶级类型对象创建特定类型,特定类型创建实例。
>> type( list 类创建列表实例(创建实例的特定类)。type 是一个内置对象,位于类型层次结构的顶部,用于生成类型。> type(type( type class creates list class (type class creates concrete class).
>type(list)
>type(type)
>>type((1)类型由派生自类型的类定义;>type(type(
>type(list)
>type(type)
2)用户定义类是类型类的实例;
3) 用户定义的类是生成自己的实例的类型。
>>class c1:pass类是类型类的实例,也是从中生成类的实例对象。>type(c1)
>type(c1())
obj.class 返回 obj 所属的类,可以是实例对象,也可以是类对象。
python3.x
>>class c:passpython2.x 现代类。>c1=c()
>type(c1)
>c1.__class__
>type(c)
>c.__class__
>c1
_main__.c object at 0x00000288f3360a90>
>c
>>class c(object):passpython2.x 传统类。>c1=c()
>type(c1)
>type(c)
>c1.__class__
>c.__class__
>c1
_main__.c object at 0x0000000003f70408>
>c
>>class c:passpython3.x,则该类是类型类的实例。>c1=c()
>type(c1)
>type(c)
>c1.__class__
>c.__class__
traceback (most recent call last):
file "", line 1, in
c.__class__
attributeerror: class c has no attribute '__class__'
1)type是生成用户定义类的类;
2)元类是类型类的子类;
3)类对象是类或子类类型的实例;
4) 实例对象是从类生成的。
用户定义类创建用户定义元类的子类(而不是类型类),以控制类的创建方式及其行为的扩展方式。
对类型类进行子分类以对其进行自定义。 将类的创建指向元类,而不是默认类型。
了解类语句如何完成工作。
在 class 语句的末尾,会自动执行 type() 方法以创建类对象并为类名赋值。
class = type(classname,superclasses,attributedict)
type 对象定义了 call operator 重载方法,调用 type 对象时,执行以下两种方法:
1) type.__new__(typeclass,classname,superclasses,attributedict)
2) type.__init__(class,classname,superclasses,attributedict)
new 方法创建并返回一个新的类对象,init 方法初始化新创建的对象。
type 的元类 子类的自定义类型的钩子。
>>class a:pass用法:>class b(a):
name='梯形图读取线'
def meth(self,arg):
pass class 语句自动调用语句末尾的 type() 来生成类对象。
b=type('b',(a,),
name=type(name, bases, dict) -a new type描述:手动调用类型调用以创建类对象。
name: 字符串,类名;
bases:元组,用于保存基类;
dict: 类属性字典;
返回值:创建一个名称名称和类型类型的类对象。
base 获取由该类的直接超类组成的元组,参考 Python 命名空间字典
例
>>>class classb: name='梯形图读取线'>> ClassB 自动调用 type() 来创建类对象并为 ClassB 赋值 >>Type(ClassB) 类对象类型为类型类型 >>Type(ClassB()) 实例对象类型为 ClassB 类类型>>ClassB基基类是 object (, classbName 类属性'梯形图读取线'等效
>>>classb=type('classb',(object,),classb >>type(classb) >type(classb())classb.__bases__ classb.name '梯形图读取线'