0

ndb.Model (Google App Engine のもの) から継承するオブジェクトがあります。このオブジェクトには、commentid というプロパティがあります。

class Comment(ndb.Model):
   commentid = ndb.StringProperty()

一連の記事を読んで、彼らは皆、これがプロパティを実装する方法だと言います:

@property
def commentid(self):
   if not self._commentid:
       self._commentid = "1"
   return self._commentid

しかし、エラーが表示されますComment object has no attribute _commentid。私は何を間違っていますか?

編集:わかりました明らかに、ここで少し混乱しています。私は Objective-C から来ました。ここでは、呼び出されたプロパティがある場合、getter と setter でx呼び出された変数を自動的に取得します。_xだから私は、これがここPythonでも起こっていることだと思いました. しかし、どうやらアンダースコアプレフィックスを使用して変数の値を手動で設定する必要があるようです。

私が望むのは、値を返す前に値のチェックを行うゲッターを実装することだけです。どうすればいいですか?

4

2 に答える 2

5

そのようなプロパティを実装するには、オブジェクトの属性を定義する必要があります。そこで行っているのは、Comment というクラスの定義ですが、そのオブジェクトの属性は定義せず、クラス自体に定義します。

小さな例でデモンストレーションしましょう:

class ExampleClass:
    name = "Example Object"

a = ExampleClass() # Init new instance of ExampleClass
print(a.name) # a doesn't own an attribute called "name"
print(ExampleClass.name) # --> "Example Object"

上記の例では、クラスを定義し、それに値を持つExampleClass変数を与えています。その後、オブジェクトを作成しますが、 name 属性を取得しません。これは、オブジェクトではなく、クラス自体に対して属性が定義されているためです。nameExample Objecta = ExampleClass()

この問題を解決するに__init__は、そのクラスのオブジェクトが作成されるたびに呼び出される -method 内で名前を定義します。

class ExampleClass:
    def __init__(self):
        self.name = "Example Class"

a = ExampleClass() # Init new instance of ExampleClass
print(a.name) # --> "Example Class"
print(ExampleClass.name) # --> ERROR: Exampleclass.name doesn't exist

そこでもう一度定義しますが、そのメソッドExampleClassも定義します。__init__Init メソッドはself、関数に自動的に与えられる 1 つのパラメーターのみを受け取ります。作成中のオブジェクトです。次にself.name = "Example Class"、 を設定します。self はオブジェクトそのものなので、オブジェクトの属性を設定しますname

プロパティの作成

属性のセッターとゲッターを実装するには、以下を追加します。

class ExampleClass:
    def __init__(self):
        self.name = "Example Class"
    
    @property
    def name(self):
        if not self._name:
            pass #blabla code here
        return self._name

    @name.setter
    def name(self, value):
        #blabla more code
        self._name = value

また、パラメーターとして__init__受け取るメソッドも編集する必要があります。name

def __init__(self, name="Example Object"):
    self.name = name
于 2012-11-22T18:57:43.513 に答える
2

直接アクセスする場合はself._commentid、定義する必要があります。そうしないと、例外が発生します。代わりに が定義されているかどうかをチェックしているので_commentid(デフォルト値を与えるために)、次を使用しますhasattr

@property
def commentid(self):
   if not hasattr(self, "_commentid"):
       self._commentid = "1"
   return self._commentid
于 2012-11-22T18:51:45.987 に答える