亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

python重寫(xiě)方法和重寫(xiě)特殊構(gòu)造方法

 更新時(shí)間:2022年07月20日 16:58:59   投稿:hqx  
這篇文章主要介紹了python重寫(xiě)方法和重寫(xiě)特殊構(gòu)造方法,對(duì)于父類的方法,只要他不符合子類模擬的實(shí)物的行為,都可以進(jìn)行重寫(xiě),更多相關(guān)內(nèi)容需要的朋友可以參考一下

繼承

編寫(xiě)類時(shí),并非總是要從空白開(kāi)始,如果編寫(xiě)的類是另一個(gè)現(xiàn)成類的特殊版本,可使用繼承,繼承分為單繼承和多繼承。

一個(gè)類繼承另一個(gè)類時(shí),將自動(dòng)獲得另一個(gè)類的所有屬性和方法,原有的類稱為父類,而新類稱為子類。子類繼承了父類所有的屬性和方法,同時(shí)還可以定義自己的屬性和方法,這樣一來(lái)就解決了類類與類之間代碼冗余的問(wèn)題

那么兒子怎么查看自己的父親是誰(shuí)呢?

如下所示:

class Parent_1:
    pass
class Parent_2:
    pass
class sub1(Parent_1):#單繼承
    pass
#查看自己的父類
print(sub1.__bases__)
class sub2(Parent_1,Parent_2):#多繼承
    pass
#查看自己的父類
print(sub2.__bases__)
(<class '__main__.Parent1'>,)
(<class '__main__.Parent1'>, <class '__main__.Parent2'>)

多繼承的優(yōu)缺點(diǎn)

優(yōu)點(diǎn):子類可以同時(shí)遺傳多個(gè)父類的屬性,最大限度地重用代碼 缺點(diǎn):違背倫理道德,一個(gè)兒子可以有多個(gè)爹,體現(xiàn)在程序中則為代碼地可讀性變差。

繼承查找的順序:

對(duì)象>子類>父類>父父類

舉例:

class Fu():
    def f1(self):
        print('Fu.f1')
    def f2(self):
        print('Fu.f2')
        self.f1()#對(duì)象名.方法(),此時(shí)的self==objects
class son(Fu):
    def f1(self):
        print('son.f1')
objects=son()
objects.f2()

根據(jù)繼承查找的順序,對(duì)象>子類>父類>父父類,先在objects空間范圍內(nèi)查找f2,如果未找到,再去子類空間范圍內(nèi)查找,最后再去父類空間范圍內(nèi)查找。

Foo.f2
Bar.f1

子類的方法__init__()

在既有類的基礎(chǔ)上編寫(xiě)新類的時(shí)候,通常要調(diào)用父類的方法__init__(),這將初始化再父類__init__()方法中定義的所有屬性,從而讓子類包含這些屬性。

舉例:

#定義一個(gè)父類Car,父類又名超類,名稱super由此而來(lái)
class Car:
    def __init__(self,make,model,year):
        self.make=make
        self.model=model
        self.year=year
        self.odometer_reading=0
    def get_descriptive_name(self):
        long_name=f"{self.year} {self.make} {self.model}"
        return  long_name.title()
    def read_odometer(self):
        print(f"this car has {self.odometer_reading} miles on it ")
    def update_odometer(self,mileage):
        if mileage>=self.odometer_reading:
            self.odometer_reading=mileage
        else:
            print("you can't roll back an odometer!")
    def increment_odometer(self,miles):
        self.odometer_reading+=miles
#定義一個(gè)子類ELectricCar,創(chuàng)建子類時(shí),父類必須包含在當(dāng)前的文件,父類必須位于子類的前面
class ELectricCar(Car):#定義子類時(shí),必須在圓括號(hào)內(nèi)指定父類的名稱
   #方法__init__()接受創(chuàng)建Car實(shí)例所需的信息
    def __init__(self,make,model,year):
        print("__init__()方法被調(diào)用")
        #讓python調(diào)用Car類的方法__init__(),讓子類創(chuàng)建的實(shí)例包含父類這個(gè)方法中定義的所有屬性
        super().__init__(make,model,year)#super是一個(gè)特殊函數(shù),使我們能夠調(diào)用父類的方法
my_tesla=ELectricCar('tesla','model s',2019)
print(my_tesla.make)
print(my_tesla.year)
print(my_tesla.model)
print(my_tesla.get_descriptive_name())
__init__()方法被調(diào)用
tesla
2019
model s
2019 Tesla Model S

對(duì)于上述代碼,我們只是想查看子類ELectricCar是否繼承了父類Car所擁有的屬性,但是子類本身,我們并沒(méi)有給他設(shè)置自身屬性和方法。

給子類定義屬性和方法:

讓一個(gè)類繼承另一個(gè)類后,就可以添加區(qū)分子類和父類所需的新屬性和新方法了。

下面來(lái)添加一個(gè)電動(dòng)車特有的屬性,以及描述該屬性的方法:

依然選用上面的代碼:

#定義一個(gè)父類Car,父類又名超類,名稱super由此而來(lái)
class Car:
    def __init__(self,make,model,year):
        self.make=make
        self.model=model
        self.year=year
        self.odometer_reading=0
    def get_descriptive_name(self):
        long_name=f"{self.year} {self.make} {self.model}"
        return  long_name.title()
    def read_odometer(self):
        print(f"this car has {self.odometer_reading} miles on it ")
    def update_odometer(self,mileage):
        if mileage>=self.odometer_reading:
            self.odometer_reading=mileage
        else:
            print("you can't roll back an odometer!")
    def increment_odometer(self,miles):
        self.odometer_reading+=miles
#定義一個(gè)子類ELectricCar,創(chuàng)建子類時(shí),父類必須包含在當(dāng)前的文件,父類必須位于子類的前面
class ELectricCar(Car):#定義子類時(shí),必須在圓括號(hào)內(nèi)指定父類的名稱
   #方法__init__()接受創(chuàng)建Car實(shí)例所需的信息
    def __init__(self,make,model,year):
        print("__init__()方法被調(diào)用")
        #讓python調(diào)用Car類的方法__init__(),讓子類創(chuàng)建的實(shí)例包含父類這個(gè)方法中定義的所有屬性
        super().__init__(make,model,year)#super是一個(gè)特殊函數(shù),使我們能夠調(diào)用父類的方法
        self.battery_size=75
    def describle_battery(self):
        print(f"this car a {self.battery_size}-kwl battery")
my_tesla=ELectricCar('tesla','model s',2019)
print(my_tesla.get_descriptive_name())
my_tesla.describle_battery() 

這時(shí),我們給子類添加了它的專有屬性describle_battery_size:

#__init__()方法被調(diào)用
2019 Tesla Model S
this car a 75-kwl battery

下面我們主要對(duì)新添加的子類專有屬性進(jìn)行分析:

  def __init__(self,make,model,year):
        print("__init__()方法被調(diào)用")
        #讓python調(diào)用Car類的方法__init__(),讓子類創(chuàng)建的實(shí)例包含父類這個(gè)方法中定義的所有屬性
        super().__init__(make,model,year)#super是一個(gè)特殊函數(shù),使我們能夠調(diào)用父類的方法
        self.battery_size=75
def describle_battery(self):#關(guān)于子類ELectricCar特有的描述
        print(f"this car a {self.battery_size}-kwl battery")

self.battery_size=75為子類特有屬性,因此寫(xiě)在子類的__init__()方法后,根據(jù)子類ELectricCar創(chuàng)建的所有實(shí)例都將把包含該屬性,但所有的Car實(shí)例都不包含它。

對(duì)于子類的特殊程度沒(méi)有任何限制,模擬子類ELectricCar時(shí),可根據(jù)所需的準(zhǔn)確程度添加任意數(shù)量的屬性和方法。

如果一個(gè)屬性或方法是任何汽車都有的,而不是子類ELectricCar特有的,就將應(yīng)將其加入到父類Car中,而不是加入到子類ELectricCar中,這樣,使用父類Car類的人將獲得相應(yīng)的功能,而使用子類ELectricCar的人只能獲得子類特有的屬性。

重寫(xiě)父類的方法

對(duì)于父類的方法,只要他不符合子類模擬的實(shí)物的行為,都可以進(jìn)行重寫(xiě),為此。可在子類中定義一個(gè)與要重寫(xiě)的父類方法同名的方法,這樣,python將不會(huì)考慮這個(gè)父類方法,而只關(guān)注你在子類中定義的相應(yīng)方法。

舉例:

假設(shè)父類Car有一個(gè)名為fill__gas__tank()的方法,他對(duì)于子類ELectricCar來(lái)說(shuō)毫無(wú)意義,因此你可能想重寫(xiě)它,那該怎么重寫(xiě)呢?
可在子類中定義一個(gè)與要重寫(xiě)的父類方法同名的方法

class Car:
  ---snip:
    def fill_gas_tank(self):
        self.fill_gas_tank=90
        print(f"電瓶車郵箱尺寸的大小是{self.fill_gas_tank}")
class ELectricCar(Car):
    --snip:
    def fill_gas_tank(self):#與父類中該屬性的方法名相同
        print("this car doesn't need a gas tank!")
my_tesla=ELectricCar('tesla','model s',2019)
print(my_tesla.get_descriptive_name())
my_tesla.fill_gas_tank()

將父類改寫(xiě)之后,輸出的不符合子類ELectricCar的方法的相關(guān)行為是我們改寫(xiě)后的,如果不進(jìn)行改寫(xiě),那么則會(huì)輸出不相關(guān)的屬性行為。

#__init__()方法被調(diào)用
2019 Tesla Model S
this car doesn't need a gas tank!

將實(shí)例用作屬性

使用代碼模擬實(shí)物時(shí),你可能會(huì)發(fā)現(xiàn)自己給類添加的細(xì)節(jié)越來(lái)越多:屬性和方法清單以及文件都越來(lái)越長(zhǎng),在這種情況下,可能需要將類的一部分提取出來(lái),作為一個(gè)單獨(dú)的類,可以將大型類拆分成多個(gè)協(xié)同工作的小類。

例如,不斷給子類ELectricCar添加細(xì)節(jié)時(shí),我們可能發(fā)現(xiàn)其中包含很多專門針對(duì)汽車電池的屬性和方法,在這種情況下我們可以將這些屬性和方法提取出來(lái),放在一個(gè)名為battery的類中,并將一個(gè)battery實(shí)例作為子類ELectricCar的屬性:

舉例:

class Car:
    --snip--
class Battery:#這里是重寫(xiě)一個(gè)類
    def __init__(self,battery_size=10):#該默認(rèn)值可設(shè)定也可不設(shè)定
        self.battery_size=battery_size
    def describle_battery(self):
        print(f"this car has a {self.battery_size}-kwl battery")
class ELectricCar(Car):
    def __init__(self,make,model,year):
        super().__init__(make,model,year)
        self.battery=Battery()#在子類ELectricCar新添加了一個(gè)名為battery的屬性
        #讓python創(chuàng)建一個(gè)新的Battery實(shí)例,并將該實(shí)例賦給屬性新創(chuàng)建的屬性battery
my_tesla=ELectricCar('tesla','model s',2019)
#和上面描述電池容量是一樣的方法
my_tesla.battery.describle_battery()#讓python在實(shí)例my_tasla中查找屬性battery,并對(duì)battery進(jìn)行調(diào)用

下面我們?cè)傧駼attery類中添加一個(gè)方法用來(lái)描述電瓶車的航行距離:

class Car:
   --snip--
class Battery:
   --snip--
    def get_range(self):
        if self.battery_size==75:
            range = 260
        elif self.battery_size==100:
            range = 315
        print(f"this car can go about {range} miles on a full charge")
class ELectricCar(Car):
   --snip--
my_tesla=ELectricCar('tesla','model s',2019)
my_tesla.battery.describle_battery()
my_tesla.battery.get_range()#在my_tesla實(shí)例中查找battery,self.battery=Battery(),對(duì)Battery進(jìn)行調(diào)用
#__init__被調(diào)用
this car has a 75-kwl battery
this car can go about 260 miles on a full charge

到此這篇關(guān)于python重寫(xiě)方法和重寫(xiě)特殊構(gòu)造方法的文章就介紹到這了,更多相關(guān)python重寫(xiě)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python實(shí)現(xiàn)用于測(cè)試網(wǎng)站訪問(wèn)速率的方法

    python實(shí)現(xiàn)用于測(cè)試網(wǎng)站訪問(wèn)速率的方法

    這篇文章主要介紹了python實(shí)現(xiàn)用于測(cè)試網(wǎng)站訪問(wèn)速率的方法,涉及Python中urllib2模塊及時(shí)間的相關(guān)操作技巧,需要的朋友可以參考下
    2015-05-05
  • 使用Python統(tǒng)計(jì)代碼運(yùn)行時(shí)間的兩種方法

    使用Python統(tǒng)計(jì)代碼運(yùn)行時(shí)間的兩種方法

    有時(shí)候我們需要記錄一個(gè)程序運(yùn)行的時(shí)間,下面這篇文章主要給大家介紹了關(guān)于使用Python統(tǒng)計(jì)代碼運(yùn)行時(shí)間的兩種方法,文中通過(guò)圖文以及示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-12-12
  • Python中的@cache巧妙用法

    Python中的@cache巧妙用法

    緩存是一種空間換時(shí)間的策略,緩存的設(shè)置可以提高計(jì)算機(jī)系統(tǒng)的性能,這篇文章主要介紹了Python中的@cache巧妙用法,需要的朋友可以參考下
    2023-04-04
  • 使用Python實(shí)現(xiàn)BT種子和磁力鏈接的相互轉(zhuǎn)換

    使用Python實(shí)現(xiàn)BT種子和磁力鏈接的相互轉(zhuǎn)換

    這篇文章主要介紹了使用Python實(shí)現(xiàn)BT種子和磁力鏈接的相互轉(zhuǎn)換的方法,有時(shí)比如迅雷無(wú)法加載磁力鏈接或者無(wú)法上傳附件分享時(shí)可以用到,需要的朋友可以參考下
    2015-11-11
  • Django博客系統(tǒng)注冊(cè)之創(chuàng)建用戶模塊應(yīng)用

    Django博客系統(tǒng)注冊(cè)之創(chuàng)建用戶模塊應(yīng)用

    本文主要介紹了Django博客系統(tǒng)注冊(cè)之創(chuàng)建用戶模塊應(yīng)用,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • 用Python寫(xiě)王者榮耀刷金幣腳本

    用Python寫(xiě)王者榮耀刷金幣腳本

    今天給大家?guī)?lái)的是用Python語(yǔ)言寫(xiě)一個(gè)關(guān)于手游王者榮耀刷金幣的腳本,有興趣的朋友參考學(xué)習(xí)下。
    2017-12-12
  • Python-接口開(kāi)發(fā)入門解析

    Python-接口開(kāi)發(fā)入門解析

    這篇文章主要介紹了Python-接口開(kāi)發(fā)入門解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • python如何調(diào)用php文件中的函數(shù)詳解

    python如何調(diào)用php文件中的函數(shù)詳解

    這篇文章主要給大家介紹了關(guān)于python如何調(diào)用php文件中函數(shù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • pytorch SENet實(shí)現(xiàn)案例

    pytorch SENet實(shí)現(xiàn)案例

    這篇文章主要介紹了pytorch SENet實(shí)現(xiàn)案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-06-06
  • python調(diào)用攝像頭顯示圖像的實(shí)例

    python調(diào)用攝像頭顯示圖像的實(shí)例

    今天小編就為大家分享一篇python調(diào)用攝像頭顯示圖像的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-08-08

最新評(píng)論