Bu 2 sınıf nasıl farklılık gösterir?
class A():
x=3
class B():
def __init__(self):
self.x=3
Önemli bir fark var mı?
Bu 2 sınıf nasıl farklılık gösterir?
class A():
x=3
class B():
def __init__(self):
self.x=3
Önemli bir fark var mı?
Yanıtlar:
A.x
bir sınıf değişkenidir .
B
's self.x
bir örnek değişkendir .
yani A
'nin x
örnekleri arasında paylaşılır.
Bir liste gibi değiştirilebilen bir şeyle farkı göstermek daha kolay olurdu:
#!/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)
Çıktı
A's x: [1, 1]
B's x: [1]
Sadece bir yan not olarak: self
aslında sadece rastgele seçilmiş bir kelime, herkesin kullandığı, ancak aynı zamanda kullanabilirsiniz this
, foo
ya myself
veya başka bir şey, istediğiniz bir sınıf için olmayan her statik yöntemin sadece ilk parametre var. Bu, kelimenin self
bir dil yapısı değil, sadece bir isim olduğu anlamına gelir :
>>> class A:
... def __init__(s):
... s.bla = 2
...
>>>
>>> a = A()
>>> a.bla
2
Ax, bir sınıf değişkenidir ve bir örnek içinde özellikle geçersiz kılınmadıkça, A'nın tüm örneklerinde paylaşılacaktır. Bx bir örnek değişkendir ve her B örneğinin kendi sürümü vardır.
Umarım aşağıdaki Python örneği açıklığa kavuşur:
>>> 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
Bunu bu örnekle açıklardım
# 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
Çıktı daha sonra
machine1.id 1 machine2.id 2 machine3.id 3 makine1. sayaç 3 makine2. sayaç 3 makine3. sayaç 3
Python öğrenmeye yeni başladım ve bu bir süredir kafamı karıştırdı. Genel olarak nasıl çalıştığını anlamaya çalışırken şu çok basit kod parçasını buldum:
# 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()
Aradığımızda şunu alırız out()
:
>>> obj.out()
red!
Aradığımızda out2()
:
>>> obj.out2()
blue!
Aradığımızda out3()
:
>>> obj.out3()
green!
Bu nedenle, ilk yöntemde self
Python'un oluşturduğumuz sınıf nesnesine "ait olan" değişkeni (özniteliği) kullanması gerektiğini belirtir, genel bir nesneye değil (sınıfın dışında). Yani kullanır color = "red"
. Yöntemde, Python örtük olarak self
oluşturduğumuz bir nesnenin adını değiştirir ( obj
). self.color
vasıta "Ben alıyorum color="red"
dan obj
"
İkinci yöntemde self
rengin alınacağı nesneyi belirtmeye gerek olmadığı için global olanı alır color = 'blue'
.
Yerine üçüncü yöntemde self
Kullandığımız obj2
- Başka nesnenin bir isim almak için color
gelen. Alır color = 'green'
.