python中已一切皆对象,类实例化后就是对象。声明一个普通的类代码如下:
class Foo:
def __init__(self, a):
self.a = a
def echo_attr(self):
print(self.a)
@staticmethod
def static_method():
pass
@classmethod
def class_method(cls):
pass
python中创建类,是通过type方法实现的,上述声明过程用type方法同样可以,等效代码如下:
def echo_attr(self):
print(self.a)
def build(self, a):
self.a = a
@staticmethod
def static_method():
pass
@classmethod
def class_method(cls):
pass
a = type('Foo', # 类名
(), # 父类元组
# 方法字典
{'echo_attr': echo_attr, "__init__": build, "static_method": static_method, "class_method": class_method}
)
类的实例化过程 :
- 调用 new 方法创建实例对象
- 创建的对象,调用 init 方法初始化
- 调用 call 返回初始化对象 这就是为什么 实例化是 可以加()的原因,比如:obj = Foo("111")
元类的简单理解就是,创建类的类,因此可以根据需要修改类的实例化过程,来实现某些业务功能。
- 元类的声明 继承type类的类就是元类,下面的例子只是加了打印
class MyMetaClass(type):
def __new__(cls, cls_name, clas_base, cls_dict):
print("元类 创建类时方法调用__new__方法")
return super(MyMetaClass, cls).__new__(cls, cls_name, clas_base, cls_dict)
def __call__(cls, *args, **kwargs):
obj = super(MyMetaClass, cls).__call__(*args, **kwargs)
print("实例化调用")
return obj
- 元类的使用:一种是继承,另一种是 通过metaclass 属性(call定义的动作不会调用)
class MyClass(metaclass=MyMetaClass):
def __init__(self, a, b=2):
print("123")
self.a = a
self.b = b
def echo_var(self):
print(f"echo_var -> {self.a}, {self.b}")
class MyMeta:
__metaclass__ = MyMetaClass
def __init__(self, a, b=2):
print("123")
self.a = a
self.b = b
def echo_var(self):
print(f"echo_var -> {self.a}, {self.b}")
网友评论