類 成員可見性 繼承

2021-10-11 09:31:44 字數 4143 閱讀 6854

類名定義:

tips:

現實世界事務的特徵和行為,抽象到類就是資料成員和方法。

例項化物件時,會自動呼叫__init__()函式。

self: 當前呼叫該方法的物件。

python 在__init__函式內定義例項變數。

嘗試訪問乙個例項變數時,python首先會在物件的例項變數列表查詢,如果找不到,則到類變數列表尋找,如果還找不到,則到其父類中尋找。

student = student('娜可露露',23)

print(student.__dict__)

print(student.__dict__)

#執行結果

> python p\p2.py

ps e:\word\python\code\abc> python p\p2.py

例項方法中訪問類變數:

類名.變數名

self.__class__.變數名

class student():

num_sum = 0

name = 'qiyue'

def __init__(self,name,age):

self.name = name

self.age = age

print(student.num_sum)

print(self.__class__.num_sum)

print(student.num_sum)

通過類呼叫例項方法,需要傳乙個引數給self形參,self此時就是乙個普通引數。

class student():

num_sum = 0

# name = 'qiyue'

def __init__(self,name,age):

self.name = name

self.age = age

self.__score = 0

def do_homework(self):

print('day day up')

student = student('娜可露露',23)

student.do_homework(student)

student.do_homework(1)

@classmethod

def plus_sum(cls):

pass

class student():

num_sum = 0

@classmethod

def plus_sum(cls):

cls.num_sum += 1

print('當前學生總數為:',cls.num_sum)

student.plus_sum() #通過類名呼叫類方法

student.plus_sum() #通過物件也可以呼叫類方法

類方法內部 不能訪問例項變數。

@staticmethod

def add(x,y):

pass

類和物件都可以呼叫靜態方法。

student = student('娜可露露',23)

student.add(4,5)

student.add(2,3)

靜態方法內部可以訪問類變數。

class student():

num_sum = 0

@staticmethod

def add(x,y):

print(student.num_sum)

靜態方法內部不可以訪問例項變數。

tips:

能用靜態方法的地方都可以用類方法來代替,當所定義函式跟類/物件沒太大關聯時使用靜態方法。

在python中,乙個變數/方法開頭是雙下劃線「__」,則認為該變數/方法是私有的。

前後都有雙下劃線,認為是公開的,比如__init__()。

class student():       

def __marking(self,score):

pass

#呼叫會報錯

student = student('娜可露露',23)

print(student.__marking(-1))

#執行結果

> python p\p2.py

traceback (most recent call last):

file "e:\word\python\code\abc\p\p2.py", line 35, in print(student.__marking(-1))

attributeerror: 'student' object has no attribute '__marking'

如果直接給私有屬性賦值/讀取,程式不會報錯。

class student():

def __init__(self,name,age):

self.name = name

self.age = age

self.__score = 0

student = student('娜可露露',23)

student.__score = 100

print(student.__score)

原因是:由於python動態語言的特性,實際上是給物件新增加了乙個屬性。

示例:

student = student('娜可露露',23)

student2 = student('橘子',20)

student.__score = 100

print(student.__score)

print(student.__dict__)

print(student2.__dict__)

print(student2.__score)

#執行結果

> python p\p2.py

100traceback (most recent call last):

file "e:\word\python\code\abc\p\p2.py", line 43, in print(student2.__score)

attributeerror: 'student' object has no attribute '__score'

分析:

可以看到student物件的屬性包括'_student__score'和 '__score',其中'_student__score'是建構函式中定義的私有屬性(python自動改名),'__score'是後來動態新增的屬性。

而student2物件就不包括屬性'__score'。

因此還可以得出乙個結論:不能動態新增私有屬性。

可以通過改名後的屬性名來訪問該私有屬性。

student = student('娜可露露',23)

student._student__score = 99

print(student._student__score)

執行結果:

> python p\p2.py

99

python支援多繼承。

一種顯式呼叫父類建構函式的方法(一般不使用):

class human():

def __init__(self,name,age):

self.name = name

self.age = age

self.__score = 0

class student(human):

def __init__(self,school,name,age):

self.school = school

human.__init__(self,name,age) #呼叫父類構造方法

主流呼叫方式::

class student(human):

def __init__(self,school,name,age):

self.school = school

super(student,self).__init__(name,age)

c 類繼承的成員可見性

1 c 繼承機制的相關知識點 繼承機制,就是利用已有的資料型別來定義新的資料型別,新資料型別將擁有基類的成員。派生類可以從乙個基類派生,也可以從多個基類派生。從乙個基類派生的繼承稱為單繼承 從多個基類派生的繼承稱為多繼承。單繼承語法 class 派生類名稱 繼承方式 基類名 多繼承語法 class ...

類成員的可見性

private 具有private屬性的成員稱為私有成員,只有本單元檔案中的程式可以訪問私有成員,而其他單元或者主程式均不能訪問這些成員。如果在乙個單元檔案中定義了2個類,則乙個類可以訪問另乙個類的私有成員。被定義的類成員僅在該類的方法中可被訪問,它的子類和例項都無法訪問。public 具有publ...

繼承的可見性

繼承的可見性 在c 中通過繼承,子類將擁有除父類的 建構函式和析構函式以外的所有的成員.注意這裡的 擁有 和 可見性 是兩個概念.擁有某個成員是指該成員確確實實地存在於該類中,但如果該成員的訪問許可權不允許該成員在繼承的子類中可見 比如private,internal 我們將不能在子類中對他們進行操...