今日內容
- 類成員
- 成員修飾符
內容回顧 & 補充
-
三大特性
-
封裝
-
函式封裝到類
-
資料封裝到物件 *
class Foo: def __init__(self,name,age): self.name = name self.age = age obj = Foo('alex',19)
-
-
繼承
-
多型
-
內容詳細
1.成員
- 類
- 類變數
- 系結方法
- 類方法
- 靜態方法
- 屬性
- 實體(物件)
- 實體變數
1.1 實體變數
class Foo:
def __init__(self,name):
self.name=name
def func(self):
print(self.name)
obj1=Foo('ALEX')
obj1.func()
obj2=Foo('ERIC')
obj2.func()
1.2 類變數
class Foo:
city='武漢'
def __init__(self,name):
self.name=name
def func(self):
pass
obj1=Foo('ALEX')
print(obj1.name)
print(obj1.city)
print(Foo.city)
obj2=Foo('ERIC')
print(obj2.name)
print(obj2.city)
print(Foo.city)
ALEX
武漢
武漢
ERIC
武漢
武漢
-
定義:寫在類的下一級和方法同一級,
-
訪問:
類.類變數名稱 物件.類變數名稱 -
面試題
class Base: x = 1 obj = Base() print(obj.x) # 先去物件中找,沒有再去類中找, obj.y = 123 # 在物件中添加了一個y=123的變數,不能修改類中的, print(obj.y) obj.x = 123#在物件中添加x=123,類中的x還是==1, print(obj.x)#列印物件中的x==123, print(Base.x)#列印的是類中的x==1, #先在物件中找,然后再到類中尋找變數,class Parent: x = 1 class Child1(Parent): pass class Child2(Parent): pass print(Parent.x,Child1.x,Child2.x) # 1 1 1 Child1.x = 2 print(Parent.x,Child1.x,Child2.x) # 1 2 1 Child2.x = 3 print(Parent.x,Child1.x,Child2.x) # 1 2 3
總結:找變數優先找自己,自己沒有找 類 或 基類;修改或賦值只能在自己的內部設定,
class Foo:
x=1
class Parent(Foo):
pass
obj=Parent()
print(obj.x)
obj.x=2
print(Parent.x)
print(obj.x)
1
1
2
1.3 方法(系結方法/普通方法)
- 定義:至少有一個self引數
- 執行:先創建物件,由物件.方法(),
class Foo:
def func(self,a,b):
print(a,b)
obj = Foo()
obj.func(1,2)
# ###########################
class Foo:
def __init__(self):
self.name = 123
def func(self, a, b):
print(self.name, a, b)
obj = Foo()
obj.func(1, 2)
1.4 靜態方法
- 定義:
- @staticmethod裝飾器
- 引數無限制
- 執行:
- 類.靜態方法名 ()
- 物件.靜態方法() (不推薦)
class Foo:
def __init__(self):
self.name = 123
def func(self, a, b):
print(self.name, a, b)
@staticmethod
def f1():
print(123)
obj = Foo()
obj.func(1, 2)
Foo.f1()
obj.f1() # 不推薦
1.5 類方法
- 定義:
- @classmethod裝飾器
- 至少有cls引數,當前類,
- 執行:
- 類.類方法()
- 物件.類方法() (不推薦)
class Foo:
def __init__(self):
self.name = 123
def func(self, a, b):
print(self.name, a, b)
@staticmethod
def f1():
print(123)
@classmethod
def f2(cls,a,b):
print('cls是當前類',cls)
print(a,b)
obj = Foo()
obj.func(1, 2)
Foo.f1()
Foo.f2(1,2)
面試題:
# 問題: @classmethod和@staticmethod的區別?
"""
一個是類方法一個靜態方法,
定義:
類方法:用@classmethod做裝飾器且至少有一個cls引數,
靜態方法:用staticmethod做裝飾器且引數無限制,
呼叫:
類.方法直接呼叫,
物件.方法也可以呼叫,
"""
1.6 屬性
- 定義:
- @property裝飾器
- 只有一個self引數
- 執行:
- 物件.方法 不用加括號,
class Foo:
@property
def func(self):
print(123)
return 666
obj = Foo()
result = obj.func
print(result)
# 屬性的應用
class Page:
def __init__(self, total_count, current_page, per_page_count=10):
self.total_count = total_count
self.per_page_count = per_page_count
self.current_page = current_page
@property
def start_index(self):
return (self.current_page - 1) * self.per_page_count
@property
def end_index(self):
return self.current_page * self.per_page_count
USER_LIST = []
for i in range(321):
USER_LIST.append('alex-%s' % (i,))
# 請實作分頁展示:
current_page = int(input('請輸入要查看的頁碼:'))
p = Page(321, current_page)
data_list = USER_LIST[p.start_index:p.end_index]#省了p.start_index()中的括號,
for item in data_list:
print(item)
2.成員修飾符
- 公有,所有地方都能訪問到,
- 私有,只有自己可以訪問到,
class Foo:
def __init__(self, name):
self.__name = name
def func(self):
print(self.__name)
obj = Foo('alex')
# print(obj.__name)#物件obj是外部,外部無法訪問,所以此處輸出錯誤,
obj.func()#此處obj呼叫方法,方法列印出私有變數,
class Foo:
__x = 1
@staticmethod
def func():
print(Foo.__x)
# print(Foo.__x)
Foo.func()
class Foo:
def __init__(self,name):
self.__x=name
def __fun(self):
print('msg')
def show(self):
self.__fun()
obj = Foo()
# obj.__fun()#子類不可以訪問父類中的私有東西,
#py后門,如果強制想訪問,print(obj._Foo__x)#贈送部分,
obj.show()
#只要前面加了雙下劃線,都是變成私有的了,私有的只有內部可以條用,外部如物件直接呼叫是不可以的,
3.補充
class Foo:
def __init__(self,num):
self.num = num
cls_list = []
for i in range(10):
cls_list.append(Foo)
for i in range(len(cls_list)):
obj = cls_list[i](i)
print(obj.num)
class Foo:
def __init__(self,num):
self.num = num
B = Foo
obj = B('alex')
class Foo:
def f1(self):
print('f1')
def f2(self):
print('f2')
obj = Foo()
v = [ obj.f1,obj.f2 ]
for item in v:
item()
class Foo:
def f1(self):
print('f1')
def f2(self):
print('f2')
def f3(self):
v = [self.f1 , self.f2 ]
for item in v:
item()
obj = Foo()
obj.f3()
class Account:
def login(self):
pass
def register(self):
pass
def run(self):
info = {'1':self.register, '2':self.login }
choice = input('請選擇:')
method = info.get(choice)
method()
class Foo:
pass
class Foo(object):
pass
# 在python3中這倆的寫法是一樣,因為所有的類默認都會繼承object類,全部都是新式類,
# 如果在python2中這樣定義,則稱其為:經典類
class Foo:
pass
# 如果在python2中這樣定義,則稱其為:新式類
class Foo(object):
pass
class Base(object):
pass
class Bar(Base):
pass
# 強制訪問私有成員
class Foo:
def __init__(self,name):
self.__x = name
obj = Foo('alex')
print(obj._Foo__x) # 強制訪問私有實體變數
總結
-
資料封裝
-
繼承關系的查找
-
嵌套
class School(object): def __init__(self,title,addr): self.title = title self.address = addr class ClassRoom(object): def __init__(self,name,school_object): self.name = name self.school = school_object s1 = School('北京','沙河') s2 = School('上海','浦東') s3 = School('深圳','南山') c1 = ClassRoom('全堆疊21期',s1) c1.name c1.school.title c1.school.address # ############################################ v = [11,22,33,{'name':'山海','addr':'浦東'}] v[0] v[3]['name']
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/193604.html
標籤:Python
上一篇:初識集成學習
下一篇:python練習——第2題
