Kod adalah seperti berikut:
# -*- coding:gb2312 -*-
class CarStore(object):
def order(self,car_type):
return Factory.select(car_type)
class Factory(object):
def select(car_type): #为什么这个地方的方法,没有self参数也可以运行?
if car_type == "索纳塔":
return Suonata()
elif car_type == "名图":
return Mingtu()
else:
print("没有您要的车型!")
class Car(object):
def move(self):
print("车在移动...")
def music(self):
print("正在播放音乐...")
def stop(self):
print("车在停止...")
class Suonata(Car):
def __init__(self):
print("索纳塔")
class Mingtu(Car):
def __init__(self):
print("名图")
car_store = CarStore()
suonata = car_store.order("索纳塔")
#car.move()
#car.music()
#car.stop()
suonata.move()
Hasil pelaksanaan:
Kod ini sendiri tidak mempunyai masalah dan boleh dilaksanakan.
Soalan saya ialah mengapa baris ketujuh kod def select(car_type): boleh dilaksanakan walaupun tiada diri? Saya masih ingat semasa saya belajar kelas, saya telah diajar bahawa setiap kaedah dalam kaedah contoh mesti menambah parameter diri, tetapi tidak ada di sini Kemudian saya menambah diri di sini dan membuat ralat, seperti yang ditunjukkan di bawah:
Hasilnya ialah ralat:
Kenapa ini berlaku?
Adakah anda menggunakan python3?
Dalam python3, jika fungsi ahli tidak menambah diri, bermakna fungsi tersebut adalah fungsi ahli statik dan boleh dipanggil terus menggunakan bentuk "nama kelas. nama fungsi (parameter)".
Tetapi jika anda menambah diri, fungsi ini ialah fungsi ahli kelas Dalam kelas panggilan lain, ia mesti dipanggil seperti ini: "Nama kelas. Nama fungsi (diri, parameter)", atau melaksanakan contoh dalam kelas panggilan. , " Nama instance. Nama fungsi (parameter)
Python3 macam ni, ujian saya, bukan dalam python2.
Anda menambah diri dalam fungsi pilih, tetapi apabila memanggilnya dalam CarStore::order(), anda menggunakan bentuk "nama kelas. nama fungsi (parameter)", jadi ia tidak betul. Apabila anda memanggil CarStore::order(), tukarkannya kepada "nama kelas. Nama fungsi (diri, parameter)" atau laksanakan contoh dalam CarStore::order(), menggunakan borang "nama instance. Nama fungsi (parameter)" Cubalah.
Saya melihatnya malam tadi, sudah terlambat, jadi saya mengujinya pagi ini.
self
Ia bukan sihir,boleh ditukar kepada sebarang nama
Ia tidak semestinya
self
Mengikut cara penulisan ini,
select
是对象方法,调用需要关联一个实例Factory()
。调用时对象实例是与第一个参数car_type
绑定。这个参数名一般约定为self
Namun, ia tidak diperlukan.Anda perlu faham bahawa dua kaedah panggilan berikut adalah berbeza:
Cara pertama ialah menggunakan objek instance untuk memanggil, parameter pertama
car_type
自动与实例对象f
绑定;第二种方式,用类去调用,第一个参数(
car_type
)没有绑定;你需要自己绑定才能不出错——也就是你传进去的car_type
:Factory.selct(car_type)
baris ini.Walau bagaimanapun, apabila anda menambah
self
后,这个函数有两个参数,但是你只绑定了car_type
,也就是绑定到第一个参数self
, yang kedua tidak mempunyai nilai, dan sesuatu pasti akan berlaku.Apa yang anda perlu lakukan di sini sebenarnya adalah untuk melaksanakan
select
ke dalam kaedah kelas:Kemudian, ambil
Factory.select(car_type)
调用时,cls
自动绑定到Factory
,而car_type
则绑定到car_type
.Yang di atas, tidak kira
self
还是cls
, hanyalah nama yang dipersetujui ialah model kelas-objek-kaedah.Adalah disyorkan untuk membaca "Analisis Kod Sumber Python" untuk sekurang-kurangnya memahami cara @classmethod berfungsi, jika tidak, anda tidak akan dapat menulis kod jenis ini dengan baik.