Rumah > pembangunan bahagian belakang > Tutorial Python > Enam soalan mengenai Python berorientasikan objek

Enam soalan mengenai Python berorientasikan objek

王林
Lepaskan: 2023-04-11 20:43:13
ke hadapan
1131 orang telah melayarinya

Artikel ini ditulis untuk rakan-rakan yang baru mengenali Python, cuba menjelaskan soalan berikut:

  • Apakah itu kelas dan objek?
  • Sekarang terdapat fungsi, mengapa adakah kita memerlukan kelas?
  • Bagaimanakah Python mentakrifkan sifat/kaedah awam/dilindungi/peribadi Adakah peribadi benar-benar peribadi?
  • Bagaimana untuk menentukan fungsi kelas, ahli? fungsi, dan fungsi statik? Mereka adalah Apakah fungsi kelas
  • yang boleh diwarisi, bagaimana untuk membuat subkelas perlu menulis semula fungsi kelas induk sebelum ia boleh digunakan, jika tidak pengecualian akan dibuang?
  • mempunyai hubungan pewarisan berikut: A, B (A),C(A),D(B,C) Jadi apabila D dimulakan, apakah susunan permulaan bagi A, B dan C? A akan dimulakan dua kali?

1 Apakah itu kelas dan objek? atau berfikir, atau khusus kepada orang yang anda cintai. Dalam dunia pengaturcaraan, objek ialah pemetaan entiti seperti orang, benda, dan objek yang wujud dalam dunia objektif dalam logik komputer.

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?

Fungsi adalah untuk menyelesaikan penggunaan semula kod, tetapi fungsi adalah pemikiran proses, terlalu spesifik, terlalu spesifik Akan ada banyak pertindihan perkara, jadi kita juga perlu mengabstrakkan masalah, dan kelas adalah sejenis abstraksi kelas yang lebih boleh digunakan semula, lebih mudah untuk menghadapi logik perniagaan yang kompleks, dan juga akan mengurangkan tekanan memori pengaturcaraan.

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?

Python bersetuju dengan protected/private in? bentuk berikut Atribut/kaedah:

__ bermaksud peribadi
  • _ bermaksud perlindungan
  • Kecuali dua yang pertama, ia adalah awam
  • Perjanjian yang dipanggil, iaitu, apabila anda melihat pembolehubah atau kaedah bermula dengan garis bawah berganda atau garis bawah tunggal, anda secara sedar tidak boleh mengubah suai atau mengaksesnya di luar kelas Dengan kata lain, Python tidak akan menghalang pengaturcara daripada mengakses atribut peribadi atau kaedah peribadi kelas Python memilih pengaturcara Amanah.

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
Salin selepas log masuk

Lihat ulasan:

Fungsi kelas dihiasi dengan @classmethod, parameter pertama mestilah cls, mewakili kelas itu sendiri Dalam erti kata lain, kita boleh menggunakannya dalam fungsi classmethod. Dari sudut ini, kita boleh membuat kesimpulan senario penggunaannya:
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'))
Salin selepas log masuk

Apabila kita perlu memanggil semula pembina, iaitu apabila mencipta objek contoh baharu
  • Adalah perlu untuk tidak mengubah suai kes contoh sedia ada mengembalikan kejadian baharu.
  • Fungsi ahli adalah sangat biasa, ia adalah kaedah yang boleh dipanggil secara langsung oleh objek Parameter pertama mestilah diri sendiri.

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

Dua kaedah, yang kedua satu adalah disyorkan.

Jenis pertama:

Jenis kedua:
class A:
def fun(self):
raise Exception("not implement")
class B(A):
pass

b = B()
b.fun()
Salin selepas log masuk

6 Terdapat hubungan warisan berikut: A, B(A), C(A) ,D(B,C) Jadi apabila D dimulakan, apakah susunan permulaan A, B dan C Adakah A akan dimulakan dua kali? adakah pesanan itu? Anda juga boleh menulis kod untuk melihat.
from abc import ABCMeta,abstractmethod
class A(metaclass = ABCMeta):
@abstractmethod
def fun(self):
pass
class B(A):
pass

b = B()
b.fun()
Salin selepas log masuk

Terdapat dua cara Cara pertama A akan dimulakan dua kali, dan cara kedua tidak.

---> B---
A--->D
---> C---
Salin selepas log masuk
Jenis pertama:

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()
Salin selepas log masuk

Output;
D is called
B is called
A is called
C is called
A is called
Salin selepas log masuk
enter D
enter B
enter C
enter A
levave A
levave C
levave B
levave D
Salin selepas log masuk

第一种方法非常明确的表明了菱形继承潜在的问题:一个基类的初始化函数可能被调用两次。在一般的工程中,这显然不是我们所希望的。

正确的做法应该是使用 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!

Label berkaitan:
sumber:51cto.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan