Как эти 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 x:", x.x)
x = B()
y = B()
x.add()
y.add()
print("B x:", x.x)
Выход
A x: [1, 1]
B x: [1]
Как примечание стороны: self
на самом деле просто случайно выбранное слово, которое все используют, но вы также можете использовать this
, foo
или myself
или что-нибудь еще, что вы хотите, это просто первый параметр каждого нестатического метода для класса. Это означает, что слово self
не является конструкцией языка, а просто именем:
>>> class A:
... def __init__(s):
... s.bla = 2
...
>>>
>>> a = A()
>>> a.bla
2
A.x - это переменная класса и будет разделяться во всех экземплярах A, если только это не переопределено в экземпляре. B.x - это переменная экземпляра, и каждый экземпляр 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 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"
. В методе Python неявно заменяет self
на имя созданного объекта (obj
). self.color
означает "Я получаю color="red"
от obj
"
Во втором методе нет self
для указания объекта, из которого должен быть выбран цвет, поэтому он получает глобальный color = 'blue'
.
В третьем методе вместо self
мы использовали obj2
- имя другого объекта для получения color
. Он получает color = 'green'
.