Python - зачем использовать «я» в классе? - PullRequest
80 голосов
/ 24 января 2009

Чем отличаются эти 2 класса?

class A():
    x=3

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

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

Ответы [ 5 ]

133 голосов
/ 24 января 2009

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

выход

А х: [1, 1]
B's x: [1]

53 голосов
/ 24 января 2009

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

>>> class A:
...     def __init__(s):
...        s.bla = 2
... 
>>> 
>>> a = A()
>>> a.bla
2
22 голосов
/ 24 января 2009

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's definition of i
    >>> f.bar()
    Foo.i is 5
    self.i is 3
16 голосов
/ 05 июля 2012

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

# 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 голосов
/ 30 июля 2014

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...