Artikel ini ditulis untuk rakan-rakan yang baru mengenali Python, cuba menjelaskan soalan berikut:
Apabila pengaturcaraan, anda boleh memetakan objek kepada apa sahaja yang anda ingin petakan Namun, jika pemetaan lebih konvensional, kod akan lebih mudah digunakan dan difahami, dan ia akan menjadi lebih kondusif untuk lelaran pantas dan seterusnya. pengembangan. Dalam dunia Python, semuanya adalah objek.
Mari kita bincangkan tentang kelas Kelas ialah kelas klasifikasi, yang mewakili koleksi perkara yang serupa dan sepadan dengan kelas kata kunci Python.
Objek ialah perkara khusus dalam kelas, yang dijana selepas permulaan kelas Ia biasanya juga dipanggil objek, atau entiti Sebagai contoh, seorang wanita ialah kelas, dan teman wanita anda ialah objek .
Atribut: Ciri statik tertentu objek, seperti warna kulit teman wanita anda, etnik, jenis darah, dsb.
Fungsi: Keupayaan dinamik tertentu objek, seperti teman wanita anda boleh menyanyi, bermain piano, dsb.
Walaupun contoh yang diberikan mungkin tidak sesuai, saya harap ia dapat mendalami pemahaman anda sebenarnya, definisi yang lebih tepat adalah seperti berikut:
Kelas ialah sekumpulan objek. dengan atribut dan fungsi yang sama.2. Memandangkan terdapat fungsi, mengapa kita memerlukan kelas?
Jika tiada kelas, lebih mudah untuk kita menulis segunung kod yang akan menjejaskan seluruh badan dan tidak berani mengubahnya. Dengan kelas, lebih mudah bagi kami untuk menulis kod yang mudah dibaca, mudah diselenggara dan boleh dikembangkan.
3. Bagaimanakah Python mentakrifkan atribut/kaedah awam/dilindungi/peribadi Ya atau tidak benar-benar peribadi, apakah tujuan berbuat demikian?
Tiada perbezaan antara mengakses harta awam dan mengakses harta benda yang dilindungi Untuk mengakses harta peribadi, anda perlu melakukan ini:
4. dan fungsi statik. Fungsi mereka masing-masing adalah Apa?object._ClassName__PrivateMember
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'))
Fungsi statik, dihiasi dengan @staticmethod, biasanya bermakna pengiraan fungsi ini tidak melibatkan pembolehubah kelas dan boleh digunakan tanpa instantiasi kelas Dalam erti kata lain, hubungan antara fungsi dan kelas ini tidak begitu rapat, Dalam erti kata lain, fungsi yang dihiasi dengan kaedah statik juga boleh ditakrifkan di luar kelas. Saya kadangkala bergelut sama ada hendak menggunakan kaedah statik dalam kelas atau menulis fungsi berasingan dalam utils.py.
5. Kelas boleh diwarisi Bagaimana untuk membuat subkelas perlu menulis semula fungsi kelas induk sebelum ia boleh digunakan, jika tidak, pengecualian akan dibuang
Jenis pertama:
Jenis kedua: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---
Output:
Jenis kedua: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()
D is called B is called A is called C is called A is called
enter D enter B enter C enter A levave A levave C levave B levave D
第一种方法非常明确的表明了菱形继承潜在的问题:一个基类的初始化函数可能被调用两次。在一般的工程中,这显然不是我们所希望的。
正确的做法应该是使用 super 来召唤父类的构造函数,而且 python 使用一种叫做方法解析顺序的算法(具体实现算法叫做 C3),来保证一个类只会被初始化一次。
也就是说,能用 super,就用 super。
Atas ialah kandungan terperinci Enam soalan mengenai Python berorientasikan objek. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!