「自己」の目的、「自己」を使用しないとどうなるのか、そして「cls」は何のためにあるのかについてのもう1つの質問です。私は「宿題をしました」、すべてを手に入れたか確認したいだけです。
self
-オブジェクトの属性にアクセスするには、属性名の前にオブジェクト名(objname.attributename
)。 self
を使用して属性にアクセスするのと同じ方法内部オブジェクト(クラス)自体。したがって、クラスメソッドで変数の前にselfを付けなかった場合、クラスの他のメソッドまたはクラス外でその変数にアクセスすることはできません。そのため、変数をそのメソッドのみにローカルにしたい場合は省略できます。メソッドがあり、他のメソッドと共有したい変数がない場合も同様に、メソッドの引数からself
を省略できます。
cls
-各インスタンスは独自の属性の「コピー」を作成するため、クラスのすべてのインスタンスで同じ変数を共有する場合は、変数名の前に「cls
」を付けます。クラス宣言内。
これでいいですか?ありがとう。
同じ方法でselfを使用して、オブジェクト(クラス)自体の内部の属性にアクセスします。
オブジェクト/クラスの内部ではなく、クラスの内部だけインスタンスメソッド。 self
は単なる慣習であり、各メソッドで異なるものであっても、好きなように呼び出すことができます。
したがって、クラスメソッドで変数の前にselfを付けなかった場合、クラスの他のメソッドまたはクラス外でその変数にアクセスすることはできません。
self
はインスタンスメソッドで使用され、cls
は多くの場合クラスメソッドで使用されます。それ以外の場合は修正します。
そのため、変数をそのメソッドのみにローカルにしたい場合は省略できます。
はい、メソッド内では変数名は他の関数内と同じです。インタープリターはローカルで名前を検索し、クロージャー、グローバル/モジュールレベル、Pythonビルトインを検索します。
メソッドがあり、他のメソッドと共有したい変数がない場合と同じ方法で、メソッドの引数からselfを省略できます。
いいえ、メソッドの引数から「self」を省略することはできません。 staticmethod
行の上に@staticmethod
を、またはメソッド本体の下にmymethod = staticmethod(mymethod)
を実行することにより、クラスのインスタンスを自動的に渡さないdef
が必要であることをPythonに伝える必要があります。
各インスタンスは独自の属性の「コピー」を作成するため、クラスのすべてのインスタンスで同じ変数を共有する場合は、クラス宣言でその変数名の前に「cls」を付けます。
クラス定義の内部、ただしメソッドの外部では、名前はクラスにバインドされます-これがメソッドの定義方法などです。cls
またはその他の接頭辞を付けないでください。
cls
は、通常、__new__
特殊なstaticmethod
、またはclassmethod
sで使用され、staticmethod
sと同様に作成します。これらは、クラスへのアクセスのみを必要とするメソッドであり、クラスの各インスタンスに固有のものへのアクセスは必要ありません。
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
インスタンスがこの引数を介して自動的に渡される通常のメソッドでは、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