从其 metaclass python 引用 class 的实例
refering to instance of a class from its metaclass python
每次创建实例时,有什么方法可以从其元class 中引用class 的实例吗?我想我应该为此目的在 metaclass 中使用 dunder _call_ 方法。
我有以下代码:
class meta(type):
def __call__(cls):
super().__call__()
#<--- want to get an object of A class here every time when instance of A class is created
class A(metaclass = meta):
def __init__(self, c):
self.c = 2
def test(self):
print('test called')
a1=A()
a2=A()
a3=A()
另外,为什么当我在 metaclass 中实现 __call__
方法时,我的 class 所有创建的实例都变成了 NoneType 但是当覆盖 __call__
我使用 super().__call__()
?
例如 a4.test()
returns AttributeError: 'NoneType' object has no attribute 'test'
新创建的实例是由 super().__call__()
编辑的 return - 你必须将这个值保存在一个变量中,使用 t 作为你想要的任何东西并 return 它。
否则,如果元类 __call__
没有 return 语句,所有实例都会立即取消引用并销毁,并且尝试创建实例的代码只会得到 None
:
class meta(type):
def __call__(cls):
obj = super().__call__()
# use obj as you see fit
...
return obj
每次创建实例时,有什么方法可以从其元class 中引用class 的实例吗?我想我应该为此目的在 metaclass 中使用 dunder _call_ 方法。
我有以下代码:
class meta(type):
def __call__(cls):
super().__call__()
#<--- want to get an object of A class here every time when instance of A class is created
class A(metaclass = meta):
def __init__(self, c):
self.c = 2
def test(self):
print('test called')
a1=A()
a2=A()
a3=A()
另外,为什么当我在 metaclass 中实现 __call__
方法时,我的 class 所有创建的实例都变成了 NoneType 但是当覆盖 __call__
我使用 super().__call__()
?
例如 a4.test()
returns AttributeError: 'NoneType' object has no attribute 'test'
新创建的实例是由 super().__call__()
编辑的 return - 你必须将这个值保存在一个变量中,使用 t 作为你想要的任何东西并 return 它。
否则,如果元类 __call__
没有 return 语句,所有实例都会立即取消引用并销毁,并且尝试创建实例的代码只会得到 None
:
class meta(type):
def __call__(cls):
obj = super().__call__()
# use obj as you see fit
...
return obj