成員和巢狀(建模)
一、成員分為三類:
1.例項變數(欄位)
公有和私有例項變數(欄位)
2.類變數(靜態欄位)
公有和私有類變數(靜態欄位)
二、巢狀
1.公有例項變數(欄位):
class Foo: def __init__(self,name): self.name=name self.age=123 def func(self): print(self.name) ojb=Foo('jjj') print(ojb.name) print(ojb.age) ojb.func() jjj 123 jjj
私有例項變數(欄位):
class Foo: def __init__(self,name): self.__name=name self.age=123 def func(self): print(self.__name) obj=Foo("你是誰") print(obj.age) obj.func()
注意:當他私有化的時候,print(obj.__name),會報錯,拿不到__name的值,只能藉助obj,func()從內部取到
類變數(靜態欄位)的公有:
class foo:
country="中國"
def __init__(self):
pass
def func(self):
print(self.country)
print(foo.country)#一般使用這個
print(foo.country)#呼叫外部
obj=foo()
obj.func()#通過內部的func呼叫
中國 中國 中國
類變數(靜態欄位)的私有:
class foo: __country="中國" def __init__(self): pass def func(self): # print(self.__country) print(foo.__country)#一般使用這個 # print(foo.__country)#呼叫外部會報錯,因為私有 obj=foo() obj.func()#通過內部的func呼叫
準則:例項變數(欄位)訪問時,使用物件訪問:obj.name
類變數(靜態欄位)訪問時,使用類方法foo.country(實在不方便時才會使用self.country)
知識點:什麼時候要用變數呢?
當所有物件中有共同的欄位且都要修改或者刪除的時候,可以將例項變數(欄位)提取到類變數(靜態欄位)
如何從繼承中獲取類變數私有中的內容呢?
class Base: __secret ="受賄" def zt(self): print(Base.__secret) class foo(Base): def func(self): print(self.__secret) print(foo.__secret) obj=foo() obj.zt() #若果沒有zt函式,是不會獲取到父級裡的__secret的,在繼承中要有表現的話才會獲取到
靜態方法使用:
class foo(object): def __init__(self,name): self.name=name def func(self): print(self.name) @staticmethod#靜態方法:如果方法無需使用物件中的值得話,就使用靜態方法 def display(a,b): return a+b obj=foo("lll") obj.func() print(obj.display(1,9)) lll 10
靜態方法的使用:
1.編寫:
方法上面寫@staticmethod
方法的引數可有可無
2.呼叫時:
類名.方法名或者物件.方法名
3.啥時候寫靜態方法:
不呼叫物件中封裝的值得時候
類方法使用:
class foo: def __init__(self,name): self.name=name def func(self): print(self.name) @staticmethod#靜態方法 def disliay(a,b): return a+b @classmethod#類方法 def show(cls,c,d): print(cls,c,d) foo.show(1,9) <class '__main__.foo'> 1 9
類方法的使用:
1.定義時:
方法上寫@classmethod
方法的引數:至少有一個cls引數
2.執行的時候
類名.方法名()#預設會將當前類傳到引數裡
3.啥時候用?
如果在方法中會用到當前類,那麼就使用類方法
私有的例項方法
class fool: def __init__(self): pass def __display(self,xxx): print("siyou ",xxx) def func(self): self.__display(123) obj=fool() obj.func() siyou 123
私有的靜態方法
class Foo(object): def __init__(self): pass @staticmethod def __display(arg): print('私有靜態 方法',arg) def func(self): Foo.__display(123) @staticmethod def get_display(): Foo.__display(888) # Foo.__display(123) 報錯 obj = Foo() obj.func() Foo.get_display() 私有靜態 方法 123 私有靜態 方法 888
屬性
class Foo(object): def __init__(self): pass @property def start(self): return 1 @property def end(self): return 10 obj = Foo() print(obj.start) print(obj.end)
1
10
屬性總結:
編寫的時候,方法上寫@property,方法引數只有一個self。
呼叫的時候無需加括號,物件.方法
應用場景:對於簡單的方法,無需傳參且沒有返回值的時候,可以使用@property
練習題:翻頁
2
普通版:
date_lst=[] for i in range(1,901): date_lst.append("alex_%s頁" %i ) while 1: page=int(input("請輸入你要檢視的頁碼")) per_page_num=10 start=(page-1)*per_page_num end=page*per_page_num page_list=date_lst[start:end] for el in page_list: print(el) 物件導向版:
class Pagenation(object):
"""
處理分頁相關的程式碼
"""
def __init__(self,data_list,page,per_page_num=10):
"""
初始化
:param data_list: 所有的資料
:param page: 當前要檢視的頁面
:param per_page_num: 每頁預設要顯示的資料行數
"""
self.data_list = data_list
self.page = page
self.per_page_num = per_page_num
@property
def start(self):
"""
計算索引的起始位置
:return:
"""
return (self.page-1) * self.per_page_num
@property
def end(self):
"""
計算索引的結束位置
:return:
"""
return self.page * self.per_page_num
def show(self):
result = self.data_list[self.start:self.end]
for row in result:
print(row)
data_list = []
for i in range(1, 901):
data_list.append('alex-%s' % i)
while True:
# 1. 要檢視的頁面
page = int(input('請輸入要檢視的頁碼:'))
obj = Pagenation(data_list,page)
obj.show()
巢狀:
""" 建立三個學校且三個學校的設施內容等都是一致. """ class School(object): def __init__(self, name, address): self.name = name self.address = address def speech(self): print('講課') obj1 = School('老男孩北京校區', '美麗富饒的沙河') obj2 = School('老男孩上海校區', '浦東新區') obj3 = School('老男孩深圳校區', '南山區') class Teacher(object): def __init__(self, name, age, salary): self.name = name self.age = age self.__salary = salary self.school = None t1 = Teacher('李傑', 19, 188888) t2 = Teacher('TT', 18, 60) t3 = Teacher('女神',16, 900000) # ############## 老師分配校區 t1.school = obj1 t2.school = obj1 t3.school = obj2 # #################################### # 檢視t1老師,所在的校區名稱/地址 print(t1.school.name) print(t1.school.address) print(t1.name) print(t1.age) t1.school.speech()