AttributeError:' property'对象没有属性

时间:2012-12-13 19:41:08

标签: python class exception object properties

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,为什么它会抱怨一个属性对象,为什么它找不到我明显可用的方法呢?

3 个答案:

答案 0 :(得分:11)

除了需要从object继承之外,属性仅适用于实例。

a = A()
a.db.doSomething("blah")

要使属性在类上运行,可以定义元类。 (类是元类的实例,因此在元类上定义的属性在类上工作,就像在类上定义的属性在该类的实例上工作一样。)

答案 1 :(得分:0)

您没有正确使用类。一类是(通常)两件事:

  1. 用于创建相关对象系列的工厂
  2. 这些对象的常见行为的定义
  3. 这些相关对象是该类的实例。在类的实例上调用普通方法,而不是在类本身上调用。如果您想要从类中调用的方法,而不需要实例,则需要使用@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:编写代码)