17.元类

旧式类和新式类

在python2中,有两种创建类的方式。非官方的称呼分别是:“旧式类”和“新式类”,在python2中,它们代表的意义不一样。

  • 旧式类
    对于旧式类,类(class)和类型(type)并不完全相同。旧式类的实例是继承自一个
    名为instance的内置类型。
  • 新式类
    新式类统一了类(class)和类型(type)的概念。所有类都继承自名为type的内置类型。
  • 注意
    1.从python2.2开始,才可以创建新式类,但还需必须声明它为新式类。
    2.在python3以后,所有类都是新式类。因此,python3可以交换一个引用对象的类型和类(因为都继承自type
  • 类型(type)和类(class)
    1.在python中,一切皆对象。所以一个类(class)必须有一个类型(type)
    2.type的类型也是type
"""
@author: LZL
"""
class Test1:
    """
    python2中,type(Test1)的值是instance;非官方说法:“旧式类”
    python3中,值是type
    """
    pass


class Test2(object):
    """
    python2和python3中,type(Test2)的值都是type;非官方说法:“新式类”
    """
    pass


print(type(Test2()))  # 
print(type(Test2))  # 
print(type(type))  # 


元类【了解】
  • 1、什么是元类?
    函数type实际上是一个元类,type就是python在背后用来创建所有类的元类。python中的任何新式类以及python3中的任何类都是type元类的一个实例。

  • 2、注意区分元类和继承的基类:
    type:元类,所有类都是通过type所创建出来的
    object:基类,所有类的顶层父类都是object

  • 3、使用type动态定义类
    内置type()函数在传递了一个参数时,将返回一个对象的类型。对于新式类,通常和对象的class属性相同:
    type(name, bases, dict)
    name:指定类名称;将成为该类的name属性(str类型)
    bases:指定继承类的父类元组;将成为该类的bases属性(tuple类型)
    dict:指定该类的属性和方法;将成为该类的dict属性(dict类型)

"""
@author: LZL
"""
t3 = type("Test3")
print(t3)  # 
print(type(t3))  # 

str1 = t3("hello")
print(str1)  # hello
print(type(str1))  # 


def func1(self):  # 类的方法
    print('self.name:', self.name)


dict1 = {"name": "lin", "age": 18, 'func': func1}  # 类的属性和方法的字典,调用用key

""" 定义一个类"""
t4 = type("Test4", (object,), dict1)

print(t4)  # 
print(t4.age)  # 18

tt4 = t4()
tt4.func()  # self.name: lin

print(t4.__dict__)
'''
{
'name': 'lin', 
'age': 18, 
'func': , 
'__module__': '__main__', 
'__dict__': , 
'__weakref__': , 
'__doc__': None
}

你可能感兴趣的:(17.元类)