我有以下问题;我想构造一个方法bar
,它的行为不同,这取决于它是在实例上调用还是在类上调用。更具体地说,让我们考虑以下代码段:
class Foo:
def bar(self):
return "bar called on an instance of Foo"
class Meta(type):
def __new__(cls, name, parents, dct):
return type.__new__(cls, name, (Foo,), dct)
def bar(self):
return "bar called on a class instantiated by Meta"
class A(metaclass=Meta):
def bar(self):
return "bar called on an instance of A"
当然,如果我创建A
类型的对象,A().bar()
会返回"bar called on an instance of A"
但是,A.bar()
会引发以下错误......
TypeError: bar() missing 1 required positional argument: 'self'
而A.bar(A)
返回"bar called on a class instantiated by Meta"
。我承认我不理解,因为A
是Meta
类型的对象......
那么,我该如何纠正这段代码呢?我的问题也有点广泛:确定属性表示法x.y
,x
是否被视为类或方法的规则是什么?