标签:python style 构造 内存 call ace 一个 metaclass 字母
__init__为Python中的构造函数
在对象实例化时,负责对对象的初始化,它并不算真正意义的构造函数,它做的事是在对象创建好之后初始化变量,真正创建实例的是__new__方法
class Foo: def __init__(self): pass obj = Foo() print(obj.__dict__) ‘‘‘ {} ‘‘‘
class Foo: def __init__(self, name, age): self.name = name self.age = age obj = Foo(‘yyf‘, 18) print(obj.__dict__) ‘‘‘ {‘name‘: ‘yyf‘, ‘age‘: 18} ‘‘‘
1, 创建一个该类的空对象 __new__
2, 实例化该空对象 __init__
3, 将实例化的空对象返回 return cls
1. 该方法是从type中继承来的,所以参数同type的init
2. 最终的工作(如果开辟空间,如果操作内存)还是要借助type
3. 再交给type最终完成工作之前,可以对垒的创建加以限制
class MyMetaClass(type): # 要重写init必须继承type def __init__(self, class_name, class_bases, class_addrs): print(class_name) # 类名 print(class_bases) # 继承的基类 print(class_addrs) # 名称空间
super().__init__(class_name, class_bases, class_addrs) # 最终还是要借助type class Foo(metaclass=MyMetaClass): def __init__(self): pass obj = Foo() # Foo = MyMetaClass(class_name, class_bases, class_addrs)
‘‘‘
Foo
()
{‘__module__‘: ‘__main__‘, ‘__qualname__‘: ‘Foo‘, ‘__init__‘: <function Foo.__init__ at 0x032D8738>}
‘‘‘
class MyMetaClass(type): def __init__(self, class_name, class_bases, class_addrs): print(class_name) if not class_name.istitle(): raise TypeError(‘第一个字母必须大写‘) super().__init__( class_name, class_bases, class_addrs) class foo(metaclass=MyMetaClass): def __init__(self): pass obj = foo() ‘‘‘ foo Traceback (most recent call last): File "D:/Python/02/myinit.py", line 48, in <module> class foo(metaclass=MyMetaClass): File "D:/Python/02/myinit.py", line 44, in __init__ raise TypeError(‘第一个字母必须大写‘) TypeError: 第一个字母必须大写 ‘‘‘
标签:python style 构造 内存 call ace 一个 metaclass 字母
原文地址:https://www.cnblogs.com/yuyafeng/p/10957823.html