Python - зачем использовать "я" в классе?

Как эти 2 класса отличаются?

class A():
    x=3

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

Есть ли существенная разница?

Ответ 1

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]

Ответ 2

Как примечание стороны: self на самом деле просто случайно выбранное слово, которое все используют, но вы также можете использовать this, foo или myself или что-нибудь еще, что вы хотите, это просто первый параметр каждого нестатического метода для класса. Это означает, что слово self не является конструкцией языка, а просто именем:

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

Ответ 3

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

Ответ 4

Я объяснил это в этом примере

# 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

Ответ 5

Я только начал изучать 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'.