Rumah  >  Soal Jawab  >  teks badan

Pemula pengaturcaraan bertanya tentang parameter kaedah kelas dalam python

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?

欧阳克欧阳克2676 hari yang lalu926

membalas semua(4)saya akan balas

  • 巴扎黑

    巴扎黑2017-06-22 11:54:02

    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.

    balas
    0
  • 三叔

    三叔2017-06-22 11:54:02

    self Ia bukan sihir,
    boleh ditukar kepada sebarang nama

    Ia tidak semestinya self

    balas
    0
  • 为情所困

    为情所困2017-06-22 11:54:02

    4 return Factory.select(self, car_type)

    balas
    0
  • PHP中文网

    PHP中文网2017-06-22 11:54:02

    class Factory(object):        
        def select(car_type):
            if car_type == "索纳塔":
                return Suonata()
            elif car_type == "名图":
                return Mingtu()
            else:
                print("没有您要的车型!")

    Mengikut cara penulisan ini, select是对象方法,调用需要关联一个实例Factory()。调用时对象实例是与第一个参数car_type绑定。这个参数名一般约定为selfNamun, ia tidak diperlukan.

    Anda perlu faham bahawa dua kaedah panggilan berikut adalah berbeza:

    f = Factory()
    f.select(xxx)
    
    Factory.select(xxx)

    Cara pertama ialah menggunakan objek instance untuk memanggil, parameter pertama car_type自动与实例对象f绑定;
    第二种方式,用类去调用,第一个参数(car_type)没有绑定;你需要自己绑定才能不出错——也就是你传进去的car_typeFactory.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:

    class Factory(object):   
    
        @classmethod     
        def select(cls, car_type):
            if car_type == "索纳塔":
                return Suonata()
            elif car_type == "名图":
                return Mingtu()
            else:
                print("没有您要的车型!")

    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.

    balas
    0
  • Batalbalas