類名定義:
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 我們將不能在子類中對他們進行操...