Dieser Artikel richtet sich an Freunde, die Python noch nicht kennen, und versucht, die folgenden Fragen zu erklären:
Ein Objekt ist ein bestimmtes Ding in einer Klasse, das nach der Initialisierung der Klasse generiert wird. Es wird normalerweise auch Objekt oder Entität genannt. Beispielsweise ist eine Frau eine Klasse und Ihre Freundin ein Objekt.
Attribut: Eine bestimmte statische Eigenschaft des Objekts, wie z. B. Hautfarbe, ethnische Zugehörigkeit, Blutgruppe usw. Ihrer Freundin.
Funktion: Eine bestimmte dynamische Fähigkeit des Objekts, z. B. kann Ihre Freundin singen, Klavier spielen usw.
Obwohl das angegebene Beispiel möglicherweise nicht angemessen ist, hoffe ich, dass es Ihr Verständnis vertiefen kann. Tatsächlich lautet die genauere Definition wie folgt:
Eine Klasse ist eine Sammlung von Objekten mit denselben Attributen und Funktionen.2. Warum brauchen wir nun Klassen, um die Wiederverwendung von Code zu lösen, aber wenn sie zu spezifisch sind, wird es auch viele Duplikate geben Spezifisch, also müssen wir immer noch Probleme abstrahieren, und Klassen sind eine Art Abstraktion. Abstrakte Klassen sind leichter wiederverwendbar, einfacher mit komplexer Geschäftslogik umzugehen und verringern auch den Speicherdruck des Programmierers beim Programmieren.
Wenn es keine Klassen gibt, ist es für uns einfacher, einen Berg von Scheißcode zu schreiben, der sich auf den gesamten Körper auswirkt, und es nicht zu wagen, ihn zu ändern. Mit Klassen ist es für uns einfacher, Code zu schreiben, der leicht zu lesen, zu warten und erweiterbar ist. 3. Wie definiert Python öffentliche/geschützte/private Attribute/Methoden?
_ bedeutet Schutz
Mit Ausnahme der ersten beiden ist es öffentlich
Die sogenannte Konvention bedeutet, dass Sie dies tun sollten, wenn Sie eine Variable oder Methode sehen, die mit einem doppelten Unterstrich oder einem einzelnen Unterstrich beginnt Bewusst nicht außerhalb der Klasse ändern oder darauf zugreifen. Mit anderen Worten: Python hindert Programmierer nicht daran, auf private Eigenschaften oder private Methoden von Klassen zuzugreifen. Es gibt keinen Unterschied zwischen dem Zugriff auf öffentliche Eigenschaften und dem Zugriff auf private Eigenschaften, Sie müssen Folgendes tun:object._ClassName__PrivateMember
Wenn wir den Konstruktor erneut aufrufen müssen, also beim Erstellen eines neuen Instanzobjekts
Wir müssen eine neue Instanz zurückgeben, ohne die vorhandene Instanz zu ändern.
Member-Funktionen sind sehr verbreitet, es handelt sich um Methoden, die direkt von einem Objekt aufgerufen werden können. Der erste Parameter muss self sein. Statische Funktion, dekoriert mit @staticmethod, bedeutet normalerweise, dass die Berechnung dieser Funktion keine Klassenvariablen umfasst und ohne Instanziierung der Klasse verwendet werden kann. Mit anderen Worten, die Beziehung zwischen der Funktion und dieser Klasse ist nicht sehr eng. Mit anderen Worten: Mit staticmethod dekorierte Funktionen können auch außerhalb der Klasse definiert werden. Manchmal habe ich Schwierigkeiten, ob ich „staticmethod“ in einer Klasse verwenden oder eine separate Funktion in „utils.py“ schreiben soll. 5. Wie man Unterklassen erstellt, muss die Funktion der übergeordneten Klasse neu schreiben, sonst wird eine Ausnahme ausgelöst.class Document(): WELCOME_STR = 'Welcome! The context for this book is {}.' def __init__(self, title, author, context): print('__init__函数被调用') self.title = title self.author = author self.__context = context #类函数 @classmethod def create_empty_book(cls, title, author): return cls(title=title, author=author, context='nothing') # 成员函数 def get_context_length(self): return len(self.__context) # 静态函数 @staticmethod def get_welcome(context): return Document.WELCOME_STR.format(context) empty_book = Document.create_empty_book('What Every Man Thinks About Apart from Sex', 'Professor Sheridan Simove') print(empty_book.get_context_length()) print(empty_book.get_welcome('indeed nothing'))
class A: def fun(self): raise Exception("not implement") class B(A): pass b = B() b.fun()
from abc import ABCMeta,abstractmethod class A(metaclass = ABCMeta): @abstractmethod def fun(self): pass class B(A): pass b = B() b.fun()
---> B--- A--->D ---> C---
class A: def __init__(self): print("A is called")class B(A): def __init__(self): print("B is called") A.__init__(self)class C(A): def __init__(self): print("C is called") A.__init__(self)class D(B,C): def __init__(self): print("D is called") B.__init__(self) C.__init__(self) d = D()
enter D enter B enter C enter A levave A levave C levave B levave D
第一种方法非常明确的表明了菱形继承潜在的问题:一个基类的初始化函数可能被调用两次。在一般的工程中,这显然不是我们所希望的。
正确的做法应该是使用 super 来召唤父类的构造函数,而且 python 使用一种叫做方法解析顺序的算法(具体实现算法叫做 C3),来保证一个类只会被初始化一次。
也就是说,能用 super,就用 super。
Das obige ist der detaillierte Inhalt vonSechs Fragen zu objektorientiertem Python. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!