我有一个类A
:
class A(object):
a = 'a'
def __init__(self):
self.b = 'b'
def foo(self):
print A.a
print self.b
我只是想知道如何通过元编程构造这个类。
我试过:
def Init(self):
self.b = 'b'
def Foo(self):
print A_CLASS.a
print self.b
A_CLASS = type('A_CLASS',(object,),{'a':'a','__init__':Init,'foo':Foo})
myObj = A_CLASS()
myObj.foo()
可以用了,但是还是有问题,就是我必须用A_CLASS
作为类名,如果用B_CLASS
就不行工作了:
B_CLASS = type('A_CLASS',(object,),{'a':'a','__init__':Init,'foo':Foo})
myObj = B_CLASS()
myObj.foo() #Error ocurred
如果有一种方法可以构建这样一个类,其中变量“X_CLASS”的名称根本不相关?
最佳答案
您的错误发生是因为 Foo
无条件引用 A_CLASS
,但您将该类绑定(bind)到全局名称 B_CLASS
。这在其他情况下会成为一个问题(pickle
依赖于类名与其在定义模块中绑定(bind)的名称相匹配),但对于这种有限的情况,它是可以修复的。不要直接引用 A_CLASS.a
,而是根据 self
引用它:
def Foo(self):
print self.a
print self.b
如果不存在该名称的实例属性,self
将查找类属性。如果您想 100% 确定它来自类,而不是实例,您可以将其定义为:
def Foo(self):
# New-style class only, but safe against weirdness like redefining __class__
print type(self).a
# Old-style class, and vast majority of non-pathological new-style classes
print self.__class__.a
print self.b
查找类,然后从类中获取属性,绕过实例属性。
在继承层次结构中,这可能是错误的。如果存在具有不同 a
类属性的 A_CHILD
类,则对其调用 Foo
将获得子属性。但这是违反规则的代价;如果你给一个类命名 A_CLASS
并将它绑定(bind)到名称 B_CLASS
,你不能通过名称 A_CLASS
来引用它进行查找(因为您的程序中没有任何部分具有该绑定(bind))。
关于python - 如何在python元编程中使用实例方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48635192/