AttributeError的:“属性”对象没有属性(AttributeError: 'pr

2019-07-05 05:38发布

的Python(2.6)似乎有derping没有理由,任何人都可以看到一个问题,这个代码?

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的:“属性”对象有没有属性“DoSomething的”

这是我的理解是,当访问一个属性将自动运行其吸气剂,所以为什么它抱怨一个属性对象,为什么没有找到我明确可行的方法?

Answer 1:

除了需要从继承object ,属性只能在实例工作。

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

为了使对类属性的工作,你可以定义一个元类。 (A类是一个元类的一个实例,因此性能上类上的元类定义工作,正如在在该类的实例的类的工作定义的属性。)



Answer 2:

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

  1. 该工厂用于组建家庭相关的对象
  2. 这些对象的共同行为的定义

这些相关的对象是类的实例 。 正常的方法调用的类的实例 ,而不是类本身。 如果你想,可以从类中调用的方法,没有一个实例,你需要标注与方法@classmethod (或@staticmethod )。

但是我真的不知道从类对象检索时属性是否正常工作。 我现在不能检查,但我不这么认为。 你所得到的错误是A.db被检索的属性对象定义的属性本身,它不是“评估”的属性来获取A.__db 。 属性对象没有doSomething属性。 性能是设计类作为这些类的实例是如何工作的描述来创建。

如果你是打算用一个实例来工作,那么你就需要创建一个:

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

然而,这也将失败。 您还没有正确地写入getDB任何一种方法。 普通方法需要一个参数来表示它是在(传统上被称为调用的情况下self ):

def getDB(self):
    ...

静态方法不这样做,但需要一个装饰他们标记为静态:

@staticmethod
def getDB():
    ...

类方法既需要一个参数来接收他们调用的类和装饰:

@classmethod
def getDB(cls):
    ...


Answer 3:

你不需要在Python干将:

class B(object):
    def do_something(self, str):
        print str

class A(object):
    db = B()

A.db.do_something("blah")

(I也PEP8:编码)



文章来源: AttributeError: 'property' object has no attribute