直接看**:
class此時,程式是不能正常執行的,執行之後報錯:person:
def__init__
(self):
self.name = "
jack
"class
student(person):
def__init__
(self):
self.school = "一中"
stu =student()
print("
學生的姓名是:
",stu.name)
這是為什麼呢?
__init__相當於是python類的構造方法,在類進行例項化時被呼叫,當子類和父類中都存在構造方法時,子類中需要顯示呼叫父類的構造方法 。需要注意的是python中構造方法是不能進行過載的,當有多個構造方法存在時,會預設呼叫最後乙個構造方法。修改後的**如下:
class此時的結果就是正常的。person:
def__init__
(self):
self.name = "
jack
"class
student(person):
def__init__
(self):super(student, self).__init__()self.school = "一中"
stu =student()
print("
學生的姓名是:
",stu.name)
super(student, self).__init__():其中super關鍵字表示父類,student是本類的名稱,self指代本類自己。
在python中如何設定私有屬性和方法?
將屬性和方法前面加上__(雙下劃線)。加上了私有的屬性和方法不能在類外進行訪問,同時,子類繼承父類的屬性和方法時,在子類中也不能夠訪問父類的私有屬性和方法。
舉個例子:
class以上**會報錯:person:
def__init__
(self):
self.
__name = "
jack
"def
__test
(self):
print("
這是父類的私有方法")
class
student(person):
def__init__
(self):
super(student, self).
__init__
() super().
__test
() self.school = "一中"
stu =student()
要想訪問到父類的私有屬性和方法,需這樣做:
class輸出:person:
def__init__
(self):
self.
__name = "
jack
"self.age = 12
def__test
(self):
print("
這是父類的私有方法")
deftest(self):
print("
這是父類的公有方法")
class
student(person):
def__init__
(self):
super(student, self).
__init__
() self.school = "一中"
defprintstudent(self):
#子類自己繼承了父類的公有屬性,直接訪問即可
print("
在子類中使用父類的共有屬性:
",self.age)
#super()代表父類,可以訪問父類的公有方法
#當然如若子類沒有重寫父類的方法,也可以使用self.test()來呼叫
#super和self區別:super是指代父類,self指代該類本身
super().test()
#對於父類的私有屬性和方法,需要通過_父類名__屬性或方法名來訪問
#super()._person__test()
self._person__test()
stu =student()
print("
學生的姓名是:
",stu._person__name)
print("
學生的年齡是:
",stu.age)
stu._person__test()
stu.printstudent()
需要明確的是python中並沒有真正意義上的私有修飾符,從以上的**也可以看出。python在執行時會將__屬性或方法轉換成:_類名__屬性或方法。通過這種方式就可以訪問到類私有屬性或方法。還有一種方式就是通過在類內部再定義乙個公有方法,來呼叫私有的屬性或方法,在子類進行呼叫時呼叫這個公有的方法即可,這也就是物件導向中封裝的作用之一,在接下來會結合進行介紹。
那麼假設父類的構造器帶有引數,那麼在子類中應該如何進行初始化呢?
子類要在初始化的時候顯示呼叫父類的有參構造,並且傳入相應的引數,具體**如下:
class輸出:person:
def__init__
(self,name,age):
self.name =name
self.
__age =age
def__test
(self):
print("
這是父類的私有方法")
deftest(self):
self.
__test
()
print("
這是父類的公有方法")
defsetage(self,age):
self.
__age =age
defgetage(self):
return self.__age
class
student(person):
def__init__
(self,school,name,age):
super(student, self).
__init__(name=name,age=age)
self.school =school
defstutest(self):
super().test()
print("
所在學校為:
",self.school)
stu = student("
一中","
tom",12)
stu.stutest()
print("
學生的姓名是:
",stu.name)
print("
學生的年齡是:
",stu.getage())
補充:假設父類中沒有顯示的定義建構函式,那麼在子類中就不用顯示的定義父類的建構函式。
class輸出:person:
deftest(self):
print("
什麼都沒有")
class
student:
def__init__
(self,name):
self.name =name
stu = student("
tom"
)print("
姓名是:
",stu.name)
py 子類繼承父類
class 派生類名 基類名 usr bin python coding utf 8 class parent 定義父類 parentattr 100def init self print 呼叫父類建構函式 defparentmethod self print 呼叫父類方法 defsetattr s...
C 類繼承之子類呼叫父類的建構函式的例項詳解
c 類繼承之子類呼叫父類的建構函式的例項詳解 父類httputil 建構函式有兩個引數,host和port 子類bmsnetutil繼承它,並將host port封裝在裡面,主程式呼叫bmsnetutil時無需再指定host port引數 這時應該這樣寫 bmsnetutil 建構函式的實現 在建構...
php父類繼承子類 PHP父類方法繼承問題
有幾個類的很相似,只是其方法對資料處理的邏輯和最後資料輸出的結果有些差別,可以通過這樣的思路實現嗎?1.思路一,通過修改抽象函式邏輯實現返回值不同abstract class parentsclass child extends parentsclass child extends parents ...