Python(2.6)似乎无缘无故,有人能看到这段代码的问题吗?
class DB ():
def doSomething (self, str):
print str
class A ():
__db = DB()
@staticmethod
def getDB ():
return A.__db
db = property(getDB)
A.db.doSomething("blah")
失败,例外情况:
AttributeError:'property'对象没有属性'doSomething'
我的理解是,一个属性在访问时会自动运行它的getter,为什么它会抱怨一个属性对象,为什么它找不到我明显可用的方法呢?
答案 0 :(得分:11)
除了需要从object
继承之外,属性仅适用于实例。
a = A()
a.db.doSomething("blah")
要使属性在类上运行,可以定义元类。 (类是元类的实例,因此在元类上定义的属性在类上工作,就像在类上定义的属性在该类的实例上工作一样。)
答案 1 :(得分:0)
您没有正确使用类。一类是(通常)两件事:
这些相关对象是该类的实例。在类的实例上调用普通方法,而不是在类本身上调用。如果您想要从类中调用的方法,而不需要实例,则需要使用@classmethod
(或@staticmethod
)标记方法。
但是我实际上并不知道从类对象中检索属性是否有效。我现在无法检查,但我不这么认为。您得到的错误是A.db
正在检索定义属性本身的属性对象,它没有“评估”该属性以获取A.__db
。属性对象没有doSomething
属性。属性设计为在类中创建,作为这些类的实例如何工作的描述。
如果您打算使用A的实例,那么您需要创建一个:
my_a = A()
my_a.db.doSomething("blah")
然而,这也将失败。您没有正确地将getDB
写成任何一种方法。普通方法需要一个参数来表示它被调用的实例(传统上称为self
):
def getDB(self):
...
静态方法没有,但需要装饰器将它们标记为静态:
@staticmethod
def getDB():
...
类方法需要一个参数来接收它们被调用的类,以及一个装饰器:
@classmethod
def getDB(cls):
...
答案 2 :(得分:-1)
你不需要Python中的getter:
class B(object):
def do_something(self, str):
print str
class A(object):
db = B()
A.db.do_something("blah")
(我也是PEP8:编写代码)