python元类编程
什么叫元类? 年轻人先不要在意这些细节、我们一步一步的来!
001、
oop的世界里有一句话 “万物皆对象”
class Person(object): name=None if __name__=="__main__": i=123 s="hello world" p=Person() print(type(i)) #<class 'int'> print(type(s)) #<class 'str'> print(type(p)) #<class '__main__.Person'> print(type(int)) #<class 'type'> print(type(str)) #<class 'type'> print(type(Person)) #<class 'type'>
我们来说一下上面代码的意思
1、前三句我们可以看出:i 是int 类的实例,s是str类的实例,p是Person类的实例;#我下面要说的话,可以让你感觉到不适
2、后三句我们可以看出:int,str,Person 这些类事实上它们都只是type类的一个实例!
002、
我真的没有逗你、type它真的是一个类呀!不信你help(type)看一下
class type(object) | type(object_or_name, bases, dict) | type(object) -> the object's type | type(name, bases, dict) -> a new type | | Methods defined here: | | __call__(self, /, *args, **kwargs) | Call self as a function. | | __delattr__(self, name, /) | Implement delattr(self, name). | | __dir__(...) | __dir__() -> list | specialized __dir__ implementation for types | | __getattribute__(self, name, /) | Return getattr(self, name). | | __init__(self, /, *args, **kwargs) | Initialize self. See help(type(self)) for accurate signature. | | __instancecheck__(...) | __instancecheck__() -> bool | check if an object is an instance | | __new__(*args, **kwargs) | Create and return a new object. See help(type) for accurate signature.
003、
上文我们说到类事实上是type的实例、我现在根你说另一件事 所有继承自type的类都是元类
例子:
003、
为了得到满足我们要求的数据类型我们会自己去定义类、例如我们自己定义一个Person类
class Person(object): name=None
上面这两行是我们最常用的,用于定义类的方法了,有了Person 这个数据类型后我就可以创建类的实例了p=Person();
但是我们这里要讲的是python oop中的更加高级的话题---- 元类 。
class Mode(type): def __new__(cls,name,bases,attrs): print("---- in __new__ fun") print("cls : {0}".format(cls)) #cls: <class '__main__.Mode'> print("name: {0}".format(name)) #name: Person print("bases: {0}".format(bases)) #bases: (<class 'object'>,) print("attrs: {0}".format(attrs)) #attrs: {'__module__': '__main__', '__qualname__': 'Person'} def toString(self): return '你好我的名字叫 {0} 今年 {1} 岁 !'.format(self.name,self.age) attrs['toString']=toString attrs['name']='蒋乐哥哥' attrs['age']=16 print(id(attrs)) print("**** out __new__ fun") return type.__new__(cls,name,bases,attrs) def __init__(cls,name,bases,attrs): print("---- in __init__ fun") print("cls : {0}".format(cls)) #cls : <class '__main__.Person'> print("name: {0}".format(name)) #name: Person print("bases: {0}".format(bases)) #bases: (<class 'object'>,) print("attrs: {0}".format(attrs)) #attrs: {'toString': <function Mode.__new__.<locals>.toString at 0x101cf5d90>, '__module__': '__main__', '__qualname__': 'Person'} print("*** out __init__ fun") class Person(object,metaclass=Mode): pass if __name__=="__main__": p=Person() print(p.toString()) #你好我的名字叫 蒋乐哥哥 今年 16 岁 !
----