Unterschied zwischen Klassenattributen, Instanzattributen und Instanzmethoden in Python

Ich weiß, dass ähnliche Fragen dazu gefragt wurden, aber jede Website scheint diese Dinge anders zu definieren, und ich versuche, die offizielle Dokumentation zu verfolgen: Von dem, was ich bisher verstehe:
– Klassenattribute sind alles, was in der class Classname: Codeblock aufgelistet ist, einschließlich der Variablendeklarationen über den __init__ Funktionen, statischen Methoden, Klassenmethoden und Methoden, die Instanzen mit self
Link für weitere Informationen: https://docs.python.org/2/tutorial/classes.html#class-objects
class Classname: sind beide: 1.) jede Funktion, die in der class Classname: Codeblock class Classname: ist, also alles andere als die Variablendeklarationen über der __init__ Funktion & 2.) __init__ , die ist, wenn wir instance.attr und das gleich __init__ setzen Wert
Link für weitere Informationen: https://docs.python.org/2/tutorial/classes.html#instance-objects

Angenommen, alles, was ich oben geschrieben habe, ist richtig, ich würde sagen, dass eine class Classname: eine beliebige Funktion in der class Classname: Codeblock ist, da wir jede Methode auf die class Classname: anwenden können oder nur die Funktionen sein können, die sich self betreffen

Ich bin mir nicht sicher, was ich falsch verstehe, aber die Terminologie der Pythonendokumentation ist völlig anders als die anderen Seiten, die ich gesehen habe. Jede Hilfe wäre sehr dankbar. Vielen Dank!

4 Solutions collect form web for “Unterschied zwischen Klassenattributen, Instanzattributen und Instanzmethoden in Python”

Klassenattribute sind für alle Instanzen der Klasse gleich, während Instanzattribute für jede Instanz besonders wichtig sind. Instanzattribute sind für datenspezifische für jede Instanz und Klassenattribute, die von allen Instanzen der Klasse verwendet werden sollen.

"Instanzmethoden" ist eine spezifische Klassenattribute, die die Instanz der Klasse als erstes Attribut akzeptieren und mit dieser Instanz zu manipulieren beginnen.

"Klassenmethoden" ist eine Methode, die in der Klasse definiert ist, die Klasse als erstes Attribut nicht Instanz akzeptiert (deshalb sind die Klassenmethoden).

Sie können Klassenattribute leicht sehen, indem Sie auf A .__ dict__ :

 class A: class_attribute = 10 def class_method(self): self.instance_attribute = 'I am instance attribute' print A.__dict__ #{'__module__': '__main__', 'class_method': <function class_method at 0x10978ab18>, 'class_attribute': 10, '__doc__': None} 

Und A().__dict__ als A().__dict__ :

 a = A() a.class_method() print a.__dict__ # {'instance_attribute': 'I am instance attribute'} 

Einige nützliche Links von offizieller Python-Dokumentation und SO, die ich hoffe, wird dich nicht mehr verwirren und klarer verstehen …

  • Python-Klassen
  • Tauche in Python, 5.8. Klassenattribute vorstellen
  • Definition von python getattr und setattr
  • Was sind die Klassenmethoden in Python?
  • Unterschied zwischen Klassen- und Instanzmethoden

Um diese Frage zu beantworten, musst du zuerst darüber nachdenken, wie python Attribute ansieht. Ich werde davon ausgehen, dass Sie wissen, was eine Instanz ist. Als Auffrischung. . .

 class SomeClass(object): class_attribute = 'This -- Defined at the class level.' def __init__(self): self.instance_attribute = 'This -- Defined on an instance.' def method(self): pass instance = SomeClass() 

Klassenattribute werden auf Klassenebene definiert. self.xyz = ... werden auf Instanzebene definiert (meist über self.xyz = ... ). Instanzattribute können auch Affen auf die Instanz gepatched werden:

 instance.another_instance_attribute = '...' 

Beachten Sie, dass Klassenattribute auf einer Instanz nachgeschlagen werden können, wenn ein Instanzattribut es nicht "schattiert".

 print(instance.class_attribute) 

Jetzt für Methoden. Methoden sind ein anderes Tier ganz.

 SomeClass.method 

Ist definitiv ein Attribut auf der Klasse.

 instance.method 

Ist ein bisschen schwieriger zu klassifizieren. Tatsächlich, wenn python diese Aussage sieht, führt es tatsächlich folgendes aus:

 SomeClass.method.__get__(instance, SomeClass) 

Seltsam. Also, was passiert hier ist, dass Funktionen sind Deskriptoren . Da sie eine __get__ Methode haben, wird es angerufen und der Rückgabewert (in diesem Fall) ist eine neue Funktion, die weiß, was self ist. Die normalen Begriffe sind "Instanzmethode" und "gebundene Methode". Ich vermute, manche mögen es als Instanzattribut betrachten, aber ich bin mir nicht sicher, ob das genau richtig ist (obwohl du es über die Instanz aufrufst)

Sie scheinen ein ziemlich anständiges Verständnis der Konzepte zu haben. Es ist schwer, Informationen zu finden, die auf eine universelle Weise erklärt werden, vor allem mit einer so weit verbreiteten Sprache wie Python. Ich werde meistens deine richtigen Annahmen wiederholen, mit ein paar kleinen Tweaks auf dem Weg.

Klassenattribute sind Merkmale, die alle Objekte aus der Klassenfreigabe erstellen. Zum Beispiel, wenn wir eine clock definieren würden, würden wir ein Klassenattribut als die Gesamtzahl der möglichen Stunden in der Uhr definieren.

 class Clock: class_hours = 12 

Es wird von allen Instanzen der Klasse geteilt und kann von jedem der Instanzen für Referenzzwecke zugegriffen werden.

Klasse Instanzen sind die tatsächlichen Daten, die wir verwenden, um einzelne charactaristiken eines aus der Klasse erstellten Objekts zu definieren. Wieder mit dem clock Class-Beispiel wäre dies die aktuelle Stunde, die wir die Uhr einstellen, wenn wir eine Uhr in einer Codezeile erstellen (und wir können auch auf unser Klassenattribut verweisen, um sicherzustellen, dass es innerhalb akzeptabler Parameter liegt):

 class Clock: class_hours = 12 def __init__(self, hours): if (hours <= class_hours): self.hours = hours 

Denken Sie daran, es ist nicht gute Praxis zu verwenden, if Aussagen innerhalb der Konstrukteure, aber das ist zum Beispiel willen. Wenn du dieses Beispiel wirklich implementieren wolltest, würdest du eine Instanzmethode verwenden, um sicherzustellen, dass die Stunde innerhalb definierter Grenzen liegt.

Instanzmethoden sind Methoden, die wir innerhalb der Klasse definieren, die die in dem Konstruktor definierten Klasseninstanzdaten manipulieren können. Wenn wir wieder zum clock zurückkehren, können wir eine Methode definieren, die die Stunde, die Minute oder die zweite der Uhrzeit ändert:

 class Clock: class_hours = 12 class_minutes = 60 class_seconds = 60 def __init__(self, hours, minutes, seconds): self.hours = hours self.minutes = minutes self.seconds = seconds def setTime(new_hour, new_minute, new_second): self.hours = new_hour self.minutes = new_minute self.seconds = new_second 

Dies erlaubt uns, die Instanz der clock zu ändern, die wir schon irgendwo in unserem Code erstellt haben. Zum Beispiel würde das Aufrufen von clock.setTime(11,49,36) diese spezielle Instanz der Uhr auf 11:49:36 setzen.

Ich hoffe, das war hilfreich und so klar wie möglich für Sie. Wenn ich zweideutig oder über jede Terminologie glänzte, verstehst du nicht, bitte lass es mich wissen, damit ich meine Antwort so klar wie möglich aktualisieren kann.

Klassenattribute – sind alles, was in der Klasse eingestuft ist. Klassenname: Codeblock, Es kann über oder unter einer beliebigen Methode liegen.

Instanzattribut – das durch die Verwendung von instance.attr oder self.attr erstellt wird (hier ist nur Instanzobjekt)

 class Base: cls_var = "class attribute" def __init__(self): self.var = "instance attribute" def method(self): self.var1 = "another instance attribute" cls_var1 = "another class attribute" 

Klassenattribute und Instanzobjekte – Sie können Klassenobjekt als Elternteil aller Instanzobjekte betrachten. So kann das Instanzobjekt auf das Attribut des Klassenobjekts zugreifen. Jedoch ist jedes, das unter dem Klassenkörper definiert ist, nur das Klassenattribut.

 class Base: cls_var = "class attribute" def __init__(self): self.var = "instance attribute" b = Base() print b.var                       # it should print "instance attribute" print b.cls_var                 # it should print "class attribute" print Base.cls_var                # it should print "class attribute" b.cls_var = "instance attribute" print Base.cls_var # it should print "class attribute" print b.cls_var # it should print "instance attribute" 

Instanzmethode – Methode, die durch def-Anweisung innerhalb der Klassen- und Instanzmethode erstellt wird, ist eine Methode, bei der das erste Argument Instanzobjekt (Selbst) ist. Aber alle Instanzmethoden sind Klassenattribute, Sie können über Instanzobjekt darauf zugreifen, da Instanzen ein Kind des Klassenobjekts sind.

 >>> class Base: def ins_method(self): pass >>> b = Base() >>> Base.__dict__ {'__module__': '__main__', '__doc__': None, 'ins_method': <function ins_method at 0x01CEE930>} >>> b.__dict__ {} 

Sie können auf Instanzmethode zugreifen, indem Sie Klassenobjekt verwenden, indem Sie die Instanz übergeben, da es die erste Parameter-

 Base.ins_method(Base()) 

Sie können diese beiden Artikel von mir auf dem gleichen Thema, die Erklärung mit Diagrammen und posten Sie mir Ihre Abfrage – http://www.pythonabc.com/python-class-easy-way-understand-python-class/ http: / /www.pythonabc.com/instanz-method-static-method-and-class-method/

Python ist die beste Programmiersprache der Welt.