web-dev-qa-db-ja.com

Python-self、no self、cls

「自己」の目的、「自己」を使用しないとどうなるのか、そして「cls」は何のためにあるのかについてのもう1つの質問です。私は「宿題をしました」、すべてを手に入れたか確認したいだけです。

self-オブジェクトの属性にアクセスするには、属性名の前にオブジェクト名(objname.attributename)。 selfを使用して属性にアクセスするのと同じ方法内部オブジェクト(クラス)自体。したがって、クラスメソッドで変数の前にselfを付けなかった場合、クラスの他のメソッドまたはクラス外でその変数にアクセスすることはできません。そのため、変数をそのメソッドのみにローカルにしたい場合は省略できます。メソッドがあり、他のメソッドと共有したい変数がない場合も同様に、メソッドの引数からselfを省略できます。

cls-各インスタンスは独自の属性の「コピー」を作成するため、クラスのすべてのインスタンスで同じ変数を共有する場合は、変数名の前に「cls」を付けます。クラス宣言内。

これでいいですか?ありがとう。

51
Joelmc

同じ方法でselfを使用して、オブジェクト(クラス)自体の内部の属性にアクセスします。

オブジェクト/クラスの内部ではなく、クラスの内部だけインスタンスメソッドselfは単なる慣習であり、各メソッドで異なるものであっても、好きなように呼び出すことができます。

したがって、クラスメソッドで変数の前にselfを付けなかった場合、クラスの他のメソッドまたはクラス外でその変数にアクセスすることはできません。

selfインスタンスメソッドで使用され、clsは多くの場合クラスメソッドで使用されます。それ以外の場合は修正します。

そのため、変数をそのメソッドのみにローカルにしたい場合は省略できます。

はい、メソッド内では変数名は他の関数内と同じです。インタープリターはローカルで名前を検索し、クロージャー、グローバル/モジュールレベル、Pythonビルトインを検索します。

メソッドがあり、他のメソッドと共有したい変数がない場合と同じ方法で、メソッドの引数からselfを省略できます。

いいえ、メソッドの引数から「self」を省略することはできません。 staticmethod行の上に@staticmethodを、またはメソッド本体の下にmymethod = staticmethod(mymethod)を実行することにより、クラスのインスタンスを自動的に渡さないdefが必要であることをPythonに伝える必要があります。

各インスタンスは独自の属性の「コピー」を作成するため、クラスのすべてのインスタンスで同じ変数を共有する場合は、クラス宣言でその変数名の前に「cls」を付けます。

クラス定義の内部、ただしメソッドの外部では、名前はクラスにバインドされます-これがメソッドの定義方法などです。clsまたはその他の接頭辞を付けないでください。

clsは、通常、__new__特殊なstaticmethod、またはclassmethodsで使用され、staticmethodsと同様に作成します。これらは、クラスへのアクセスのみを必要とするメソッドであり、クラスの各インスタンスに固有のものへのアクセスは必要ありません。

classmethod内では、はい、これを使用して、クラスのすべてのインスタンスとクラス自体を共有する属性を参照します。

selfと同様に、clsは単なる慣習であり、好きなように呼び出すことができます。

簡単な例:

class Foo(object):

    # you couldn't use self. or cls. out here, they wouldn't mean anything

    # this is a class attribute
    thing = 'athing'

    def __init__(self, bar):
        # I want other methods called on this instance of Foo
        # to have access to bar, so I create an attribute of self
        # pointing to it
        self.bar = bar

    @staticmethod
    def default_foo():
        # static methods are often used as alternate constructors,
        # since they don't need access to any part of the class
        # if the method doesn't have anything at all to do with the class
        # just use a module level function
        return Foo('baz')

    @classmethod
    def two_things(cls):
        # can access class attributes, like thing
        # but not instance attributes, like bar
        print cls.thing, cls.thing
86
agf

インスタンスがこの引数を介して自動的に渡される通常のメソッドでは、selfを最初の引数として使用します。したがって、メソッドの最初の引数が何であれ、現在のinstanceを指します。

メソッドが@classmethodで装飾されている場合、クラスは最初の引数として渡されます。そのため、最も一般的な名前はclassを指すclsです。

通常、変数をprefixしません(ハンガリーの表記法は不適切です)。


次に例を示します。

class Test(object):
    def hello(self):
        print 'instance %r says hello' % self
    @classmethod
    def greet(cls):
        print 'class %r greet you' % cls

出力:

>>> Test().hello()
instance <__main__.Test object at 0x1f19650> says hello

>>> Test.greet()
class <class '__main__.Test'> greet you
10
ThiefMaster