python類、繼承
Python 是一種面向物件的程式語言。Python 中的幾乎所有東西都是物件,擁有屬性和方法。類(Class)類似物件建構函式,或者是用於建立物件的“藍圖”。
一、python 類
1 建立類
使用class關鍵字
例項
使用名為 x 的屬性,建立一個名為 MyClass 的類
class MyClass: x = 5
2 建立物件
現在我們可以使用名為 myClass 的類來建立物件:
例項
建立一個名為 p1 的物件,並列印 x 的值:
p1 = MyClass() print(p1.x)
3__init__() 函式
上面的例子是最簡單形式的類和物件,在實際應用程式中並不真正有用。要理解類的含義,我們必須先了解內建的__init__()函式。
例項
建立名為 Person 的類,使用 __init__() 函式為 name 和 age 賦值:
class Person: def __init__(self, name, age): self.name = name self.age = age p1 = Person("Bill", 63) print(p1.name) print(p1.age)
註釋:每次使用類建立新物件時,都會自動呼叫__init__() 函式。
4 物件方法
物件也可以包含方法。物件中的方法是屬於該物件的函式。讓我們在 Person 類中建立方法:
例項
插入一個列印問候語的函式,並在 p1 物件上執行它:
class Person: def __init__(self, name, age): self.name = name self.age = age def myfunc(self): print("Hello my name is " + self.name) p1 = Person("Bill", 63) p1.myfunc()
提示:self 引數是對類的當前例項的引用,用於訪問屬於該類的變數。
self 引數
self引數是對類的當前例項的引用,用於訪問屬於該類的變數。它不必被命名為self,您可以隨意呼叫它,但它必須是類中任意函式的首個引數:
例項
使用單詞 mysillyobject 和 abc 代替 self:
class Person: def __init__(mysillyobject, name, age): mysillyobject.name = name mysillyobject.age = age def myfunc(abc): print("Hello my name is " + abc.name) p1 = Person("Bill", 63) p1.myfunc()
修改物件屬性
把 p1 的年齡設定為 40:
p1.age = 40
刪除物件屬性
del p1.age
刪除物件
del p1
二、繼承
繼承允許我們定義繼承另一個類的所有方法和屬性的類。父類是繼承的類,也稱為基類。子類是從另一個類繼承的類,也稱為派生類。
1 建立父類
任何類都可以是父類,因此語法與建立任何其他類相同:
例項
建立一個名為 Person 的類,其中包含 firstname 和 lastname 屬性以及 printname 方法:
class Person: def __init__(self, fname, lname): self.firstname = fname self.lastname = lname def printname(self): print(self.firstname, self.lastname) # 使用 Person 來建立物件,然後執行 printname 方法: x = Person("Bill", "Gates") x.printname()
2 建立子類
要建立從其他類繼承功能的類,請在建立子類時將父類作為引數傳送:
例項
建立一個名為 Student 的類,它將從 Person 類繼承屬性和方法:
class Student(Person): pass
例項
使用 Student 類建立一個物件,然後執行 printname 方法:
x = Student("Elon", "Musk") x.printname()
新增__init__()函式
到目前為止,我們已經建立了一個子類,它繼承了父類的屬性和方法。我們想要把__init__()函式新增到子類(而不是pass關鍵字)。
註釋:每次使用類建立新物件時,都會自動呼叫 __init__() 函式。
例項
為Student 類新增 __init__() 函式:
class Student(Person): def __init__(self, fname, lname): # 新增屬性等
當您新增 __init__() 函式時,子類將不再繼承父的 __init__() 函式。
註釋:子的 __init__() 函式會覆蓋對父的 __init__() 函式的繼承。
如需保持父的 __init__() 函式的繼承,請新增對父的 __init__() 函式的呼叫:
例項
class Student(Person): def __init__(self, fname, lname): Person.__init__(self, fname, lname)
使用 super() 函式
Python 還有一個super()函式,它會使子類從其父繼承所有方法和屬性:
例項
class Student(Person): def __init__(self, fname, lname): super().__init__(fname, lname)
新增屬性
例項
把名為graduationyear的屬性新增到Student類:
class Student(Person): def __init__(self, fname, lname): super().__init__(fname, lname) self.graduationyear = 2019
新增方法
例項
把名為welcome的方法新增到 Student 類:
class Student(Person): def __init__(self, fname, lname, year): super().__init__(fname, lname) self.graduationyear = year def welcome(self): print("Welcome", self.firstname, self.lastname, "to the class of", self.graduationyear)