Python-なぜクラスで「自己」を使用するのですか?


82

これらの2つのクラスはどのように異なりますか?

class A():
    x=3

class B():
    def __init__(self):
        self.x=3

大きな違いはありますか?


6
いいえ、重複していません。

1
@hop:興味深い主張ですが、重複していないという例や証拠は提供されていません。なんでそんなこと言うの?
S.Lott 2009年

2
@ S.Lott-え?もう1つの質問は、なぜ明示的に自己を渡す必要があるのか​​を尋ねることです。これは、クラス変数とインスタンス変数のため、違いについて質問しています。
ダナ

1
@ S.Lottそれは同じ質問ではありません。私はそれを尋ねる前にそれを見さえしました。
ryeguy 2009年

2
@ S.Lott:68282は、メソッドの最初の引数として自分自身を明示的に配置する必要がある理由についての役に立たない質問です。この質問は、クラスメンバーとインスタンスメンバーの違いについて尋ねます。S.Lott、SOへのあなたの貢献は本当に好きですが、今回は間違っています。

回答:


137

A.xあるクラス変数はBさんは、self.xあるインスタンス変数

すなわちAxインスタンス間で共有されています。

リストのように変更できるものとの違いを示す方が簡単です。

#!/usr/bin/env python

class A:
    x = []
    def add(self):
        self.x.append(1)

class B:
    def __init__(self):
        self.x = []
    def add(self):
        self.x.append(1)

x = A()
y = A()
x.add()
y.add()
print("A's x:", x.x)

x = B()
y = B()
x.add()
y.add()
print("B's x:", x.x)

出力

A's x: [1, 1]
B's x: [1]

8
スクリプトの出力も投稿すると、自分でコピーして実行しなくても違いを確認できます...
Martin

7
出力を追加しました。
UnkwnTech 2009年

2
では、Pythonの自己はJavaのこれと同等ですか?noobishnessくださいすみません
ジャンAzzopardi

2
@ Jean-はい-ish-selfは、インスタンスメソッドの最初のパラメータに付けられた従来の名前である必要があります-pythonは、インスタンスメソッドの現在のインスタンスをインスタンスメソッドの最初の引数として明示的に渡します。しかし、それはJavaのこれと同じ仕事をします
Douglas Leeder 2009年

@Jean Azzopardi:selfはJava(およびc ++)のようなものです。自己は単に必要です。これは、Javaコンパイラによって推論されることがあります(それ以外の場合は必要です)
S.Lott 2009年

55

ただ、サイドノートとして:self実際にはランダムに選ばれた言葉で、その誰もが使用していますが、また使用することができthisfooまたはmyselfあるいはあなたが望む何か、それはクラスのすべての非静的メソッドの最初のパラメータだけです。これは、単語selfが言語構成ではなく、単なる名前であることを意味します。

>>> class A:
...     def __init__(s):
...        s.bla = 2
... 
>>> 
>>> a = A()
>>> a.bla
2

1
なぜこれがコメントではなく答えなのか
Gabriel Petersson

23

Axはクラス変数であり、インスタンス内で特にオーバーライドされない限り、Aのすべてのインスタンス間で共有されます。Bxはインスタンス変数であり、Bの各インスタンスには独自のバージョンがあります。

次のPythonの例で明確になることを願っています。


    >>> class Foo():
    ...     i = 3
    ...     def bar(self):
    ...             print 'Foo.i is', Foo.i
    ...             print 'self.i is', self.i
    ... 
    >>> f = Foo() # Create an instance of the Foo class
    >>> f.bar()
    Foo.i is 3
    self.i is 3
    >>> Foo.i = 5 # Change the global value of Foo.i over all instances
    >>> f.bar()
    Foo.i is 5
    self.i is 5
    >>> f.i = 3 # Override this instance's definition of i
    >>> f.bar()
    Foo.i is 5
    self.i is 3

16

私はこの例でそれを説明していました

# By TMOTTM

class Machine:

    # Class Variable counts how many machines have been created.
    # The value is the same for all objects of this class.
    counter = 0

    def __init__(self):

        # Notice: no 'self'.
        Machine.counter += 1

        # Instance variable.
        # Different for every object of the class.
        self.id = Machine.counter

if __name__ == '__main__':
    machine1 = Machine()
    machine2 = Machine()
    machine3 = Machine()

    #The value is different for all objects.
    print 'machine1.id', machine1.id
    print 'machine2.id', machine2.id
    print 'machine3.id', machine3.id

    #The value is the same for all objects.
    print 'machine1.counter', machine1.counter
    print 'machine2.counter', machine2.counter
    print 'machine3.counter', machine3.counter

その後、出力は

machine1.id 1
machine2.id 2
machine3.id 3

machine1.counter 3
machine2.counter 3
machine3.counter 3

3

私はPythonを学び始めたばかりで、これもしばらくの間私を混乱させました。それが一般的にどのように機能するかを理解しようとして、私はこの非常に単純なコードを思いつきました:

# Create a class with a variable inside and an instance of that class
class One:
    color = 'green'

obj2 = One()


# Here we create a global variable(outside a class suite).
color = 'blue'         

# Create a second class and a local variable inside this class.       
class Two:             
    color = "red"

    # Define 3 methods. The only difference between them is the "color" part.
    def out(self):     
        print(self.color + '!')

    def out2(self):
        print(color + '!')

    def out3(self):
        print(obj2.color + '!')

# Create an object of the class One
obj = Two()

電話をかけるout()と、次のようになります。

>>> obj.out()

red!

私たちが呼ぶときout2()

>>> obj.out2()

blue!

私たちが呼ぶときout3()

>>> obj.out3()

green!

したがって、最初のメソッドでselfは、Pythonが変数(属性)を使用する必要があることを指定します。これは、グローバルオブジェクト(クラス外)ではなく、作成したクラスオブジェクトに「属します」。したがって、を使用しcolor = "red"ます。このメソッドでは、Pythonselfは、作成したオブジェクトの名前を暗黙的に置き換えます(obj)。self.color「私はcolor="red"から得ているobj」という意味です

2番目の方法ではself、色を取得するオブジェクトを指定する必要がないため、グローバルオブジェクトを取得しcolor = 'blue'ます。

3番目のメソッドでは、代わりに-取得する別のオブジェクトの名前selfを使用しました。取得します。obj2colorcolor = 'green'

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.