oriented - python oop exercises



Python-warum "Selbst" in einer Klasse verwenden? (4)

Ax ist eine Klassenvariable und wird für alle Instanzen von A gemeinsam genutzt, sofern sie nicht ausdrücklich in einer Instanz außer Kraft gesetzt werden. Bx ist eine Instanzvariable und jede Instanz von B hat ihre eigene Version.

Ich hoffe das folgende Python Beispiel kann verdeutlichen:


    >>> 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

Wie unterscheiden sich diese 2 Klassen?

class A():
    x=3

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

Gibt es einen signifikanten Unterschied?


Answer #1

Ich habe es mit diesem Beispiel erklärt

# 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

Die Ausgabe wird dann von

machine1.id 1
machine2.id 2
machine3.id 3

machine1.counter 3
machine2.counter 3
machine3.counter 3

Answer #2

Nur als eine Randnotiz: self ist eigentlich nur ein zufällig gewähltes Wort, das jeder benutzt, aber du könntest auch this , foo oder myself oder irgendetwas anderes verwenden, das du willst, es ist nur der erste Parameter jeder nicht statischen Methode für eine Klasse. Das bedeutet, dass das Wort self kein Sprachkonstrukt ist, sondern nur ein Name:

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

Answer #3

Ax ist eine Klassenvariable . B self.x ist eine Instanzvariable .

dh A 's x wird zwischen Instanzen geteilt.

Es wäre einfacher, den Unterschied mit etwas zu demonstrieren, das wie eine Liste modifiziert werden kann:

#!/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

Ausgabe

A's x: [1, 1]
B's x: [1]





oop