所以,我有一个类,其中一个类变量设置为__init__
方法中类工厂的输出,如下所示:
def MyFooFactory():
def __init__(self, *args):
# Do __init__ stuff
def MyBar(myFoo_obj):
print "MyBar"
newclass = type("MyFoo", tuple(object), {"__init__": __init__, "MyBar": MyBar} )
return newclass
class Foo:
Bar = 0
def __init__(self):
if (type(Foo.Bar) is int):
Bar = MyFooFactory()
def MyBar(a_list):
for l in a_list:
Bar.MyBar(l)
但是,当我尝试这个时
myBar_list = [Foo.Bar() for _ in range(x)]
Foo.MyBar(myBar_list)
TypeError:未绑定方法必须使用Foo实例作为第一个参数调用MyBar()(改为获取列表)
是否发生这种情况是因为MyBar
在Foo
和MyFoo
中具有相同的名称,或者此处还有其他内容?
作为参考,两个MyBar
方法都应该是未绑定的。
谢谢,
答案 0 :(得分:2)
这是因为您忘记了self
MyBar
参数
试试这个:
class Foo:
...
def MyBar(self, a_list):
for l in a_list:
Bar.MyBar(l)
如果它应该是" unbound"方法使用@staticmethod
decorator:
答案 1 :(得分:2)
声明
Bar = MyFooFactory()
正在分配一个本地,而不是Bar
Foo.MyBar
成员
如果要在方法内分配语法
Foo.Bar = MyFooFactory()
类体内的范围规则有点令人惊讶。
答案 2 :(得分:2)
Python 中的实例方法必须将self
作为第一个参数(其中def MyBar(self, a_list):
...
实际上只是一个正式的参数名称 - 它通过美德绑定到实例成为第一个,所以你有
@staticmethod
def MyBar(a_list):
...
另一方面,如果您确实需要静态方法,则必须use the @staticmethod
decorator:
{{1}}
另见答案:What is the difference between @staticmethod and @classmethod in Python?