9

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: 'property' オブジェクトに属性 'doSomething' がありません

アクセス時にプロパティが自動的にゲッターを実行することを理解していたのに、プロパティオブジェクトについて不平を言っているのはなぜですか?また、明らかに利用可能なメソッドが見つからないのはなぜですか?

4

3 に答える 3

19

から継承する必要があることに加えてobject、プロパティはインスタンスでのみ機能します。

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

プロパティをクラスで機能させるために、メタクラスを定義できます。(クラスはメタクラスのインスタンスであるため、クラスで定義されたプロパティがそのクラスのインスタンスで機能するのと同様に、メタクラスで定義されたプロパティはクラスで機能します。)

于 2012-12-13T19:45:46.267 に答える
1

クラスを正しく使用していません。クラスは (通常) 2 つのものです。

  1. 関連オブジェクトのファミリを作成するためのファクトリ
  2. それらのオブジェクトの一般的な動作の定義

これらの関連オブジェクトは、クラスのインスタンスです。通常のメソッドは、クラス自体ではなく、クラスのインスタンスで呼び出されます。インスタンスなしでクラスから呼び出すことができるメソッドが必要な場合は、メソッドに@classmethod(または@staticmethod) のラベルを付ける必要があります。

ただし、クラスオブジェクトから取得したときにプロパティが機能するかどうかは実際にはわかりません。今は確認できませんが、そうではないと思います。あなたが得ているエラーA.dbは、プロパティ自体を定義するプロパティオブジェクトを取得していることです.getするプロパティを「評価」していませんA.__db. プロパティ オブジェクトにはdoSomething属性がありません。プロパティは、それらのクラスのインスタンスがどのように機能するかの説明として、クラスで作成されるように設計されています。

A のインスタンスを使用するつもりだった場合は、インスタンスを作成する必要があります。

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

ただし、これも失敗します。getDBどの種類のメソッドとしても正しく記述されていません。通常のメソッドには、呼び出されたインスタンスを表す引数が必要です (従来は と呼ばれていましたself)。

def getDB(self):
    ...

静的メソッドはそうではありませんが、それらを static としてラベル付けするデコレータが必要です:

@staticmethod
def getDB():
    ...

クラス メソッドには、呼び出されたクラスを受け取るための引数と、デコレータの両方が必要です。

@classmethod
def getDB(cls):
    ...
于 2012-12-13T20:16:16.740 に答える
-1

You don't need getters in Python:

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

class A(object):
    db = B()

A.db.do_something("blah")

(I also PEP8:ed the code)

于 2012-12-13T19:52:37.037 に答える