1. 程式人生 > >Python3 類繼承 匯入類

Python3 類繼承 匯入類

參考檔案:《Python程式設計:從入門到實踐》

Car類,Car.py檔案

#!/usr/local/python3.6.1/bin/python3

class Car():
    """一次模擬汽車的簡單嘗試"""
    odometer_reading = 0
    def __init__(self, make, model, year):
        """初始化描述汽車的屬性"""
        self.make = make
        self.model = model
        self.year = year
    def get_descriptive_name(self):
        """返回整潔的描述性資訊"""
        long_name = str(self.year) + ' ' + self.make + ' ' + self.model
        return long_name.title()

    def read_odometer(self):
        print("This car has " + str(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

在Car.py檔案中例項化物件,如下:

my_new_car = Car('audi', 'a4', 2016)
print(my_new_car.get_descriptive_name())
my_new_car.read_odometer()
執行後的效果如下:
[[email protected] python3.com]# ./Car.py 
2016 Audi A4
This car has 0 miles on it.

繼承

子類的方法__init__()

建立子類的例項時, Python首先需要完成的任務是給父類的所有屬性賦值。 為此, 子類的方法__init__() 需要父類施以援手。

#!/usr/local/python3.6.1/bin/python3

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 = str(self.year) + ' ' + self.make + ' ' + self.model
        return long_name.title()
    def read_odometer(self):
        print("This car has " + str(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

class ElectricCar(Car):
    """電動汽車的獨特之處"""
    def __init__(self, make, model, year):
        """初始化父類的屬性"""
        super().__init__(make, model, year)

my_tesla = ElectricCar('tesla', 'model s', 2016)
print(my_tesla.get_descriptive_name())
執行效果:
[[email protected] python3.com]# ./ElectricCar.py 
2016 Tesla Model S

匯入類

如單獨一個Car.py檔案,單獨一個ElectricCar.py檔案,單獨一個man.py檔案;在man.py檔案中,ElectricCar繼承了Car,例項化一個ElectricCar物件。

Car.py檔案

#!/usr/local/python3.6.1/bin/python3
#①
class Car():
    """一次模擬汽車的簡單嘗試"""
    odometer_reading = 0
    def __init__(self, make, model, year):
        """初始化描述汽車的屬性"""
        self.make = make
        self.model = model
        self.year = year
    def get_descriptive_name(self):
        """返回整潔的描述性資訊"""
        long_name = str(self.year) + ' ' + self.make + ' ' + self.model
        return long_name.title()
    def read_odometer(self):
        print("This car has " + str(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
ElectricCar.py檔案
#!/usr/local/python3.6.1/bin/python3
#②
import Car

class ElectricCar(Car.Car):
    """電動汽車的獨特之處"""
    #③
    def __init__(self, make, model, year):
        """初始化父類的屬性"""
        #④
        super().__init__(make, model, year)
man.py檔案
#!/usr/local/python3.6.1/bin/python3

#匯入ElectricCar類,並重命名為e
import ElectricCar as e
#⑤
my_tesla = e.ElectricCar('tesla', 'model s', 2016)
print(my_tesla.get_descriptive_name())
執行man.py檔案的結果為:
2016 Tesla Model S
首先是Car 類的程式碼(見①) 。 建立子類時, 父類必須包含在當前檔案中, 且位於子類前面。 在②處, 我們定義了子類ElectricCar 。 定義子類時, 必須在括號內指定父類的
名稱。 方法__init__() 接受建立Car 例項所需的資訊(見③) 。
④處的super() 是一個特殊函式, 幫助Python將父類和子類關聯起來。 這行程式碼讓Python呼叫ElectricCar 的父類的方法__init__() , 讓ElectricCar 例項包含父類的所
有屬性。 父類也稱為超類 (superclass) , 名稱super因此而得名。
為測試繼承是否能夠正確地發揮作用, 我們嘗試建立一輛電動汽車, 但提供的資訊與建立普通汽車時相同。 在⑤處, 我們建立ElectricCar 類的一個例項, 並將其儲存在變
量my_tesla 中。 這行程式碼呼叫ElectricCar 類中定義的方法__init__() , 後者讓Python呼叫父類Car 中定義的方法__init__() 。 我們提供了實參'tesla' 、 'model
s' 和2016 。
除方法__init__() 外, 電動汽車沒有其他特有的屬性和方法。 當前, 我們只想確認電動汽車具備普通汽車的行為


相關推薦

Python3 繼承 匯入

參考檔案:《Python程式設計:從入門到實踐》 Car類,Car.py檔案 #!/usr/local/python3.6.1/bin/python3 class Car(): """一次模擬汽車的簡單嘗試""" odometer_reading = 0

繼承後想要擴展父方法

保留 回調 gen obj pcl logs col 父類 sel 1 >>> class PClass(object): 2 def setInfo(self,sex=‘Male‘): 3 self.gender = se

Java 子繼承成員中的問題

subclass 情況 討論 就會 之前 測試 public 測試結果 string   之前搞錯了,變量沒有“重寫”一說,只有方法才能被“重寫”。如果我們在子類中聲明了一個和父類中一樣的變量,那麽實際的情況是,子類的內存堆中會有類型和名字都相同的兩個變量。   現在考慮一

python 子繼承__init__(轉載)

elf lpad pla 最好 就是 main 代碼 borde wid 轉載: http://www.jb51.net/article/100195.htm 前言 使用Python寫過面向對象的代碼的同學,可能對 __init__ 方法已經非常熟悉了,__init__

繼承,父中的構造器

gen 向上轉型 類構造 復制 使用 article col 成員 ring 子類繼承父類,子類構造器會默認調用super()(無論構造器中是否寫有super()),用於初始化父類成員.同時當父類中存在有參構造器時,必須提供無參構造器,子類構造器中並不會自動繼承有參構造器,

java異常練習題:定義一個MulException繼承Exception,要求兩數相乘等於100報錯,在主中定義一個方法,在方法中丟擲此異常,在主方法觀察結果

題目描述: 定義一個MulException類繼承Exception類,要求兩數相乘等於100報錯,在主類中定義一個方法,在方法中丟擲此異常,在主方法觀察結果。  定義一個DivException類繼承RuntimeException類,要求兩數相除等於2報錯,在主類中定義

java中子繼承程式執行順序問題

測試程式碼: package test; public class FatherTest { private String name; public FatherTest(){ System.out.println("--父類的無參建構函式--"); } public

1).定義一個MulException繼承Exception,要求兩數相乘等於100報錯,在主中定義一個方法,在方法中丟擲此異常,在主方法觀察結果。

1).定義一個MulException類繼承Exception類,要求兩數相乘等於100報錯,在主類中定義一個方法,在方法中丟擲此異常,在主方法觀察結果。 2).定義一個DivException類繼承RuntimeException類,要求兩數相除等於2報錯,在主類中定義一個方法,在方法中丟

c++子繼承函式呼叫特性原理以及與java的對比

c++ c++中子類繼承了父類,子類物件的函式和變數會接著新增在父類物件的記憶體後面,以此類推。。。 如果c++中父類的那個變數或者函式宣告為virtual虛擬函式,那麼子類物件的同名函式就直接覆蓋了(即在記憶體中真正的覆蓋,父類的這個函式已經不在了)父類物件的這個函式 如

Java子繼承的載入順序,看著一篇就夠了

1. 程式碼 package parent; public class Child extends Father { static { System.out.println("

記mybatis-generator生成實體繼承的一個大坑

我的天哪,一個簡單的問題,搞死我了。 在我們用mybatis-generator生成實體類的時候,會希望這些實體類繼承自一個基類,這個基類包含了實體類共同的屬性,如uuid,createdate等資訊。 問題來了,直接在generatorConfig中新增roo

java中的繼承-子繼承的許可權問題

                                                java中的繼承         Java語言面向物件有三大特性:封裝、繼承、多型。其中的繼承,描述了一

java中子繼承和實現介面有同名方法怎麼處理

Java是一門單繼承語言,但是,在子類的繼承關係中,會存在父類和介面有同名方法的情況,這種情況該怎麼處理呢? 我們來一步步驗證: 1.子類繼承父類,實現介面,父類和介面有同名方法 public int

java中子繼承呼叫利用繼承方法時呼叫this

package cn.itcast.test1; class Parent{     public Object getObject(){         return this;     } } c

python 子繼承的__init__方法

父類: 1 class A(object): 2 def __init__(self, name): 3 self.name = name 4 print("父類name:", self.name) 5 6 def getName(self): 7

java中子繼承時是否繼承建構函式呢?

java繼承中對建構函式是不繼承的。 以下是例子:  public class FatherClass { public FatherClass() {       System.out.println(100); }  public FatherClass(int age)

Java中子繼承關於構造方法的問題

子類繼承了父類,若父類的構造方法沒有過載那麼,子類的構造方法也不需要通過super呼叫父類構造方法。一個類中如果構造方法重寫了並且帶了引數,那麼這個類的原來系統預設的無參構造方法便消失。由此,若一個父類中只有一個帶引數的構造方法,那麼在寫其子類的構造方法時必須先通過super

繼承的輸出結果

public class A { static{ System.out.println("static in class A"); } public A(){ System.out.println("class A"); }

繼承的虛擬函式呼叫

父類:Father 子類:Son 1.  Father* fa=new Son()     例項1: #include<iostream> using namespace std; class Father{ public: Father(){ cou

關於子繼承後呼叫方法的問題

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 class ParentClass { public String m