Python3学习笔记——类
生活随笔
收集整理的這篇文章主要介紹了
Python3学习笔记——类
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
#!/usr/bin/env python
#-*- coding:utf-8 -*-
#面向?qū)ο?#xff08;類+對(duì)象)
三大特性:封裝、繼承、多態(tài)
類的成員:字段:普通字段:保存在對(duì)象(實(shí)例)中,執(zhí)行只能通過對(duì)象訪問靜態(tài)字段:保存在類中,執(zhí)行時(shí)可以通過對(duì)象訪問,也可以通過類訪問方法:普通方法:保存在類中,由對(duì)象調(diào)用靜態(tài)方法:@staticmethod,保存在類中,通過類可以直接調(diào)用,且不需要self參數(shù)類方法:@classmethod,保存在類中,由類直接調(diào)用,需要一個(gè)cls參數(shù),代指當(dāng)前類類的創(chuàng)建和使用:
class 類名:def 方法名(self,參數(shù)):print("hello")實(shí)例名=類名()
實(shí)例名.方法名(參數(shù))# 1.類的定義:class Bar: #叫Bar的類def foo(self): #叫foo的方法print('hello')# 2.類的執(zhí)行
obj = Bar() #創(chuàng)建實(shí)例(對(duì)象)--執(zhí)行方法的中間人
obj.foo() #
# 3.self參數(shù)
類在創(chuàng)建的過程中會(huì)在內(nèi)存中開辟一個(gè)屬于類的空間,當(dāng)創(chuàng)建一個(gè)實(shí)例的時(shí)候也會(huì)創(chuàng)建屬于實(shí)例的空間,
當(dāng)實(shí)例需要執(zhí)行類中的方法,回去找類空間相應(yīng)的方法,方法中的self參數(shù),接收的就是實(shí)例本身。
所以self代指調(diào)用方法的對(duì)象(實(shí)例)
例1:
class Bar:def foo(self,arg):print(self,arg)obj = Bar()
print(obj)
obj.foo('hello')<__main__.Bar object at 0x000001D1995E4470>
<__main__.Bar object at 0x000001D1995E4470> hello
例2:
class Bar:def foo(self,arg):print(self,self.name,arg) #②self表示實(shí)例本身,self.name:從方法中讀取實(shí)例中的元素,
obj = Bar()
obj.name = "Tom" #①在實(shí)例的內(nèi)存空間中添加新的元素
obj.foo('hello')<__main__.Bar object at 0x000001EB3F6645F8> Tom hello# 4.構(gòu)造方法
obj = Bar() #作用:1.創(chuàng)建對(duì)象;2.通過對(duì)象執(zhí)行類中的一個(gè)特殊方法
例1:
class Bar:def __init__(self):"""構(gòu)造方法"""print('創(chuàng)建對(duì)象時(shí)自動(dòng)執(zhí)行構(gòu)造方法')obj = Bar()
例2:
class Bar:def __init__(self,name,age):self.n = nameself.a = agedef foo(self):print(self.n,self.a)obj = Bar("Tom",10)
obj.foo()# 5.類的三大特性之“繼承”
5.1:父類與子類
class Father: #父類(基類)def __init__(self):passdef bar(self):passclass Son(Father): #子類(派生類)def foo(self):passobj = Son()
obj.bar()
5.2:類的重寫
class F:def f1(self):print('F.f1')def f2(self):print('F.f2')class S(F):def s1(self):print('S.s1')def f2(self): #重寫父類方法,其本質(zhì)是在執(zhí)行f2的方法時(shí),在S類中已經(jīng)找到,不會(huì)再向上(即父類)去找print('S.f2')
obj = S()
obj.f2()
5.3:supper(子類名,self).父類方法父類名.父類方法(self)
class F:def f1(self):print('F.f1')def f2(self):print('F.f2')class S(F):def s1(self):print('S.s1')def f2(self):super(S,self).f2() #先執(zhí)行父類的方法,再執(zhí)行自己的方法F.f2(self) # 另一種寫法,推薦使用supper寫法print('S.f2')
obj = S()
obj.f2()5.4:多繼承①左側(cè)優(yōu)先②一條道做到黑③有共同的父類,最后在父類中找
例1:
class F:def bar(self):print('F.bar')class F1(F):def boo(self):print('F1.bar')class F2:def bar(self):print('F2.bar')class S(F1,F2): #從下往上找passobj = S()
obj.bar()
---------
F.bar
例2:
class F1:def bar(self):print('F1.bar')class F2:def bar(self):print('F2.bar')class S(F2,F1): #從左往右找passobj = S()
obj.bar()
---------
F2.bar例3:
class Base:def bar(self):print('Base.bar')class F(Base):def foo(self):print('F.bar')class F1(F):def foo(self):print('F1.bar')class F2(Base):def bar(self):print('F2.bar')class S(F1,F2):passobj = S()
obj.bar() #有共同的父類,最后在父類中找
---------
F2.bar# 6.類的三大特性之多態(tài)
Python原生多態(tài)。# 7.類的成員之字段
class Bar:#靜態(tài)字段:屬于類,city = "Beijing"def __init__(self,name):#普通字段:屬于對(duì)象,只能通過對(duì)象(實(shí)例)訪問self.name = name#普通方法def foo(self):print(self.name)obj = Bar('Tom')
#通過對(duì)象訪問普通字段
print(obj.name)
#直接通過類訪問靜態(tài)字段
print(Bar.city)-------
Tom
Beijing# 8.類的成員之方法
class Bar:# 普通方法def foo(self):print("Bar.foo")# 靜態(tài)方法
@staticmethoddef show(): #
print("Bar.show")# 靜態(tài)方法
@staticmethoddef person(name,age):print(name,age)# 類方法
@classmethoddef classmd(cls): # cls是類名,print('Bar.classmd')print(cls)
# 普通方法,通過對(duì)象調(diào)用
obj = Bar()
obj.foo()
# 靜態(tài)方法,通過類可以直接調(diào)用
Bar.show()
Bar.person('Tom',18)
# 類方法,通過類可以直接調(diào)用
Bar.classmd()---------
Bar.show
Tom 18
Bar.classmd
<class '__main__.Bar'># 應(yīng)用場(chǎng)景:
# 對(duì)象中需要保存一些值,執(zhí)行某功能的時(shí)候需要使用對(duì)象中的值 --> 普通方法
# 不需要對(duì)象中的值 --> 靜態(tài)方法# 9.類的成員之屬性
class Bar:def __init__(self):pass# 屬性
@propertydef foo(self):return 1@foo.setterdef foo(self,val):print(val,"setter")@foo.deleterdef foo(self):print("delete")obj = Bar()
obj.foo=123 #執(zhí)行賦值語句將執(zhí)行@foo.setter下對(duì)應(yīng)的方法
del obj.foo #執(zhí)行@foo.deleter下對(duì)應(yīng)的方法----------
123 setter
delete
例1:
class Page:def __init__(self,page):try:p = int(page)except Exception as e:p = 1self.page = p@propertydef start(self):val = (self.page-1) * 10return val@propertydef end(self):val = self.page * 10return valli = []
for i in range(1000):li.append(i)
while True:p = input("請(qǐng)輸入頁碼:")if p == "q":breakobj = Page(p)print(li[obj.start:obj.end])例2:屬性的另一種表示方法
class Bar:def f1(self):return 1def f2(self,val):print('f2:',val)def f3(self):print("f3:del")per = property(fget=f1,fset=f2,fdel=f3,doc="注釋")obj = Bar()
print(obj.per)
obj.per = 123
del obj.per
----------
1
f2: 123
f3:del# 10.成員修飾符***子類在繼承父類時(shí),父類中的私有字段子類不能繼承***
例:公有成員和私有成員
#!/usr/bin/env python
# -*- coding: utf-8 -*-
class Bar:__city = "Beijing" #靜態(tài)字段的私有化def __init__(self,name,age):self.name = nameself.__age = age #私有字段,外部不能直接訪問def foo(self): #方法可以訪問私有字段,通過方法間接訪問私有字段print(self.__age)def __show(self): # 私有方法,外部不能直接訪問return "hello world"def func(self): #間接訪問私有方法return self.__show()obj = Bar('Tom',18)
print(obj.name)
obj.foo() # 通過方法間接訪問私有字段#間接訪問私有方法
r = obj.func()
print (r)# 11.特殊成員
11.1 __call__方法
class Bar:def __init__(self):print("init")def __call__(self):print("call")
obj = Bar()
obj() #對(duì)象加括號(hào)自動(dòng)執(zhí)行__call__方法11.2 __str__ 與 __int__
class Bar:def __init__(self):passdef __int__(self):return 111def __str__(self):return "str"
obj = Bar()
print(obj,type(obj))
r = int(obj) #int 加對(duì)象,自動(dòng)執(zhí)行對(duì)象的int方法,并將返回值賦值給int對(duì)象
print(r)
r = str(obj)
print(r) #str 加對(duì)象,自動(dòng)執(zhí)行對(duì)象的str方法,并將返回值賦值給str對(duì)象
------------
str <class '__main__.Bar'>
111
str11.3 例:__str_
class Bar:def __init__(self,name,age):self.name = nameself.age = agedef __str__(self):return "%s:%s" %(self.name,self.age)obj = Bar("Tom",18)
print(obj)
-----------
Tom:18
11.4 __del__ 析構(gòu)方法:對(duì)象銷毀的時(shí)候執(zhí)行
class Bar:def __init__(self):passdef __del__(self):print("析構(gòu)方法")
obj = Bar()11.5 __dict__ 將字段中的成員以字段的形式返回
class Bar:"""注釋"""def __init__(self,name,age):self.name = nameself.age = ageobj = Bar('Tom',18)
#將字段中的成員以字段的形式返回
print(Bar.__dict__)
print(obj.__dict__)
---------
{'__module__': '__main__', '__init__': <function Bar.__init__ at 0x0000013DAD733AE8>, '__weakref__': <attribute '__weakref__' of 'Bar' objects>, '__doc__': '注釋', '__dict__': <attribute '__dict__' of 'Bar' objects>}
{'name': 'Tom', 'age': 18}
11.6 __getitem__ 、 __setitem__ 和 __delitem__
class Bar:"""注釋"""def __init__(self):passdef __getitem__(self,item):return item + 10def __setitem__(self,k,v):print(k,v) def __delitem__(self,val):print('delete:',val)
obj = Bar()
print(obj[2])
obj['name']='Tom'
del obj['del']
----------------
12
name Tom
delete: del11.7 __iter__如果類中有__iter__方法,其對(duì)象就是一個(gè)可迭代對(duì)象;對(duì)象名.__iter__()的返回值是迭代器class Bar:def __iter__(self):return iter([11,22,33])obj = Bar()
for i in obj:print(i)#for循環(huán)執(zhí)行obj對(duì)象的類中的__iter__方法,并獲取其迭代器;循環(huán)上一步中返回的對(duì)象# 12.mateclass# 13.反射
#通過字符串操作對(duì)象中的成員
class Bar:def __init__(self,name,age):self.name = nameself.age = agedef foo(self):print("hello world")obj = Bar("Tom",18)b = "name" #利用b取出obj中name的值
# 方法1:
print(obj.__dict__[b])
# 方法2:
# getattr() 去什么東西里面獲取什么內(nèi)容
s = getattr(obj,b)
print(s)f = getattr(obj,'foo')
print(f)
f()#getattr 判斷是否有某個(gè)成員
print(hasattr(obj,'foo'))#setattr
setattr(obj,'k1','v1') #新設(shè)置的值存在對(duì)象中
print(obj.k1)#delattr
delattr(obj,'name')
print(obj.name)# 從類中取成員
class Bar:city = "Beijing"def __init__(self,name,age):self.name = nameself.age = agedef foo(self):print("hello world")print(getattr(Bar,'city'))# 從模塊中取成員
import module
getattr(module,'func')
getattr(module,'Bar')
# 例:反射的應(yīng)用
#!/usr/bin/env python
# -*- coding: utf-8 -*-
while True:inp = input("請(qǐng)輸入要訪問的URL:")if inp == "q":breakclass Bar:def f1(self):return "首頁"def f2(self):return "新聞"def f3(self):return "博客"obj = Bar()if hasattr(obj,inp):f = getattr(obj,inp)print(f())else:print("404")# 14.單例模式
應(yīng)用場(chǎng)景:數(shù)據(jù)庫連接池
例:
class Bar:__v = None@classmethoddef get_instance(cls):if cls.__v:return cls.__velse:cls.__v = Bar()return cls.__v
# 不用再使用Bar()創(chuàng)建實(shí)例
obj1 = Bar.get_instance()
print(obj1)
obj2 = Bar.get_instance()
print(obj2)
obj3 = Bar.get_instance()
print(obj3)
----------------
<__main__.Bar object at 0x0000026D865B4A20>
<__main__.Bar object at 0x0000026D865B4A20>
<__main__.Bar object at 0x0000026D865B4A20>
?
轉(zhuǎn)載于:https://www.cnblogs.com/gaoyuanzhi/p/9108518.html
總結(jié)
以上是生活随笔為你收集整理的Python3学习笔记——类的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 问题(待完成):微服务,失败回滚?保持事
- 下一篇: Spring常用注解总结