これらの2つのクラスはどのように異なりますか?
class A():
x=3
class B():
def __init__(self):
self.x=3
大きな違いはありますか?
これらの2つのクラスはどのように異なりますか?
class A():
x=3
class B():
def __init__(self):
self.x=3
大きな違いはありますか?
回答:
A.x
あるクラス変数は。
B
さんは、self.x
あるインスタンス変数。
すなわちA
のx
インスタンス間で共有されています。
リストのように変更できるものとの違いを示す方が簡単です。
#!/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]
ただ、サイドノートとして:self
実際にはランダムに選ばれた言葉で、その誰もが使用していますが、また使用することができthis
、foo
またはmyself
あるいはあなたが望む何か、それはクラスのすべての非静的メソッドの最初のパラメータだけです。これは、単語self
が言語構成ではなく、単なる名前であることを意味します。
>>> class A:
... def __init__(s):
... s.bla = 2
...
>>>
>>> a = A()
>>> a.bla
2
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
私はこの例でそれを説明していました
# 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
私は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
を使用しました。取得します。obj2
color
color = 'green'