Python中關(guān)于面向?qū)ο笏接袑傩苑椒ǖ脑敿?xì)講解
1.私有屬性和私有方法
封裝的意義:
將屬性和方法放到一起做為一個整體,然后通過實(shí)例化對象來處理;
隱藏內(nèi)部實(shí)現(xiàn)細(xì)節(jié),只需要和對象及其屬性和方法交互就可以了;
對類的屬性和方法增加 訪問權(quán)限控制。
私有權(quán)限:在屬性名和方法名 前面 加上兩個下劃線 __
類的私有屬性 和 私有方法,都不能通過對象直接訪問,但是可以在本類內(nèi)部訪問;
類的私有屬性 和 私有方法,都不會被子類繼承,子類也無法訪問;
私有屬性 和 私有方法 往往用來處理類的內(nèi)部事情,不通過對象處理,起到安全作用。
私有屬性:
class Person(object): def __init__(self,name,age): self.name=name self.__age=age p=Person('fei',22) print(p.name) print(p.__age)
私有方法:
class Person(object): def __init__(self,name,age): self.name=name self.__age=age def __pmethod(self): print('私有方法') p=Person('fei',22) print(p.name) p.__pmethod() # 調(diào)用私有方法
類部調(diào)用私有屬性和私有方法
class Person(object): def __init__(self,name,age): self.name=name self.__age=age def __pmethod(self): print('私有方法') def shuxing(self): return self.__age def method(self): return self.__pmethod() p=Person('fei',22) print(p.shuxing()) p.method()
子類不能繼承父類私有屬性和方法
class Person(object): def __init__(self,name,age): self.name=name self.__age=age def __pmethod(self): print('私有方法') def pme(self): print('66666') class Animal(Person): pass a=Animal('fei',22) print(a.name) print(a.__age)
class Person(object): def __init__(self,name,age): self.name=name self.__age=age def __pmethod(self): print('私有方法') def pme(self): print('66666') class Animal(Person): pass a=Animal('fei',22) a.pme() a.__pmethod()
1). 私有屬性,可以在類內(nèi)部通過self調(diào)用,但不能通過對象訪問
2). 私有方法,可以在類內(nèi)部通過self調(diào)用,但不能通過對象訪問
3). 對象不能訪問私有權(quán)限的屬性和方法
4). 子類不能繼承父類私有權(quán)限的屬性和方法
5). Python中沒有像C++中 public 和 private, protected 這些關(guān)鍵字來區(qū)別公有屬性和私有屬性。
6). Python是以屬性命名方式來區(qū)分,如果在屬性和方法名前面加了2個下劃線'__',則表明該屬性和方法是私有權(quán)限,否則為公有權(quán)限。
2.修改私有屬性的值
class Person(object): def __init__(self): self.__age=24 def set_age(self,age): self.__age=age def get_age(self): return self.__age p=Person() p.set_age(28) print(p.get_age())
現(xiàn)代軟件開發(fā)中,通常會定義get_xxx()方法和set_xxx()方法來獲取和修改私有屬性值
get_xxx()方法–>返回私有屬性的值
set_xxx()方法–>接收參數(shù),修改私有屬性的值
對象不能訪問私有權(quán)限的屬性和方法,可以通過訪問公有方法set_money()來修改私有屬性的值,可以通過訪問公有方法get_money()來獲取私有屬性的值
3.類屬性和實(shí)例屬性
類屬性就是類對象所擁有的屬性,它被所有類對象的實(shí)例對象所共有,在內(nèi)存中只存在一個副本,這個和C++中類的靜態(tài)成員變量有點(diǎn)類似。對于公有的類屬性,可以通過類或者實(shí)例對象訪問
實(shí)例屬性只能通過對象來調(diào)用,類不能調(diào)用
類屬性:
class People(object): name = 'Tom' # 公有的類屬性 __age = 12 # 私有的類屬性 p = People() print(p.name) # 正確 print(People.name) # 正確 print(p.__age) # 錯誤,不能在類外通過實(shí)例對象訪問私有的類屬性 print(People.__age) # 錯誤,不能在類外通過類對象訪問私有的類屬性
可以通過類或者實(shí)例對象調(diào)用
實(shí)例屬性(對象屬性)
class People(object): address = '山東' # 類屬性 def __init__(self): self.name = 'xiaowang' # 實(shí)例屬性 self.age = 20 # 實(shí)例屬性 p = People() p.age = 12 # 實(shí)例屬性 print(p.address) # 正確 print(p.name) # 正確 print(p.age) # 正確 print(People.address) # 正確 print(People.name) # 錯誤 print(People.age) # 錯誤
可以通過實(shí)例化對象調(diào)用,類不能調(diào)用
通過實(shí)例(對象)去修改類屬性
class People(object): country = 'china' #類屬性 print(People.country) p = People() print(p.country) p.country = 'japan' print(p.country) # 實(shí)例屬性會屏蔽掉同名的類屬性 print(People.country) del p.country # 刪除實(shí)例屬性 print(p.country)
對象修改類屬性,只對本對象有效果,對別的
對象沒有影響
4.類方法和靜態(tài)方法
類方法:
類方法是類對象所擁有的方法,需要用修飾器@classmethod來標(biāo)識其為類方法,對于類方法,第一個參數(shù)必須是類對象,一般以cls作為第一個參數(shù)(當(dāng)然可以用其他名稱的變量作為其第一個參數(shù),但是大部分人都習(xí)慣以'cls'作為第一個參數(shù)的名字,就最好用'cls'了),能夠通過實(shí)例對象和類對象去訪問。
class People(object): # 類屬性 age =18 #類方法,用classmethod來進(jìn)行修飾 @classmethod def get_country(cls): return cls.age p = People() print(p.get_country()) #可以用過實(shí)例對象引用 print(People.get_country()) #可以通過類對象引用
class People(object): # 類屬性 age= 18 #類方法,用classmethod來進(jìn)行修飾 @classmethod def get_country(cls): return cls.age @classmethod def set_country(cls,age): cls.age = age p = People() print(p.get_country()) #可以用過實(shí)例對象訪問 print(People.get_country()) #可以通過類訪問 p.set_country(23) print(p.get_country()) print(People.get_country()) p1 = People() print(p1.get_country())
結(jié)果顯示在用類方法對類屬性修改之后,通過類對象和實(shí)例對象訪問都發(fā)生了改變(全部改變)
靜態(tài)方法:
需要通過修飾器@staticmethod來進(jìn)行修飾,靜態(tài)方法不需要多定義參數(shù),可以通過對象和類來訪問。
class People(object): country = 'china' @staticmethod #靜態(tài)方法 def get_country(): return People.country p = People() # 通過對象訪問靜態(tài)方法 print(p.get_country()) # 通過類訪問靜態(tài)方法 print(People.get_country())
靜態(tài)方法中不需要額外定義參數(shù),因此在靜態(tài)方法中引用類屬性的話,必須通過類實(shí)例對象來引用,調(diào)用靜態(tài)方法可以通過對象或者類調(diào)用
實(shí)例方法
實(shí)例方法中的第一個參數(shù)是self,只能通過對象來訪問。
class People(object): def selfmethod(self): print("我是實(shí)例方法") p = People() p.selfmethod() #People.selfmethod() #報(bào)錯
實(shí)例方法中需要self參數(shù),因此調(diào)用實(shí)例方法只能通過實(shí)例對象調(diào)用 也可以通過類調(diào)用但是一般不這樣用
總結(jié):
類方法使用@classmethod裝飾,第一個參數(shù)為類(cls),調(diào)用時可以通過類的實(shí)例或者類本身來調(diào)用。
實(shí)例方法定義時第一個參數(shù)為類的一個實(shí)例(self),調(diào)用時必須通過實(shí)例調(diào)用。
靜態(tài)方法使用@staticmethod裝飾,調(diào)用時可以使用類的實(shí)例或者類本身來調(diào)用。
5.__new__方法
__new__和__init__的作用
class A(object): def __init__(self): print('init方法') def __new__(cls, *args, **kwargs): print('new方法') return object.__new__(cls) a=A()
總結(jié):
1). __new__至少要有一個參數(shù)cls,代表要實(shí)例化的類,此參數(shù)在實(shí)例化時由Python解釋器自動提供
2). __new__必須要有返回值,返回實(shí)例化出來的實(shí)例,這點(diǎn)在自己實(shí)現(xiàn)__new__時要特別注意,可以return父類__new__出來的實(shí)例,或者直接是object的__new__出來的實(shí)例
3). __init__有一個參數(shù)self,就是這個__new__返回的實(shí)例,__init__在__new__的基礎(chǔ)上可以完成一些其它初始化的動作,__init__不需要返回值
4). 我們可以將類比作制造商,__new__方法就是前期的原材料購買環(huán)節(jié),__init__方法就是在有原材料的基礎(chǔ)上,加工,初始化商品環(huán)節(jié)
6.單例模式
單例模式:永遠(yuǎn)用一個對象得實(shí)例,避免新建太多實(shí)例浪費(fèi)資源
實(shí)質(zhì):使用__new__方法新建類對象時先判斷是否已經(jīng)建立過,如果建過就使用已有的對象
class Foo(object): instance = None def __init__(self): self.name = 'alex' def __new__(cls): if Foo.instance: return Foo.instance else: Foo.instance = object.__new__(cls) return Foo.instance obj1 = Foo() obj2 = Foo() print(obj1,obj2)
福利
class Teacher(object): __money=100000 age=45 def xuexi(self): print('只要學(xué)不死就往死里學(xué)') def __zhengqian(self): print('掙錢掙到吐') # 調(diào)用學(xué)生類中的掙錢方法 def zhengqian(self): return self.__zhengqian() def money(self): return self.__money # 修改老師類中的私有屬性為200000 def set_xiugai(self,money): self.__money=money def get_xiugai(self): return self.__money class Student(Teacher): def xuexi(self): print('死活都不去學(xué)習(xí)') s=Student() s.xuexi() # 調(diào)用學(xué)生類中掙錢的方法 s.zhengqian() # 調(diào)用老師類中的私有屬性 print(s.money()) # 修改老師類中的私有屬性為200000 s.set_xiugai(200000) print(s.get_xiugai()) # 調(diào)用老師類中的私有方法 s.zhengqian() # 修改類屬性 s.age=55 print(s.age)
到此這篇關(guān)于Python中關(guān)于面向?qū)ο笏接袑傩苑椒ǖ脑敿?xì)講解的文章就介紹到這了,更多相關(guān)Python 面向?qū)ο?私有屬性方法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
通過Python實(shí)現(xiàn)自動填寫調(diào)查問卷
這篇文章主要介紹了通過Python實(shí)現(xiàn)自動填寫調(diào)查問卷的相關(guān)資料,需要的朋友可以參考下2017-09-09matplotlib事件處理基礎(chǔ)(事件綁定、事件屬性)
這篇文章主要介紹了matplotlib事件處理基礎(chǔ)(事件綁定、事件屬性),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02將python依賴包打包成window下可執(zhí)行文件bat方式
今天小編就為大家分享一篇將python依賴包打包成window下可執(zhí)行文件bat方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-12-12Python中urllib與urllib2模塊的變化與使用詳解
urllib是python提供的一個用于操作URL的模塊,在python2.x中有URllib庫,也有Urllib2庫,在python3.x中Urllib2合并到了Urllib中,我們爬取網(wǎng)頁的時候需要經(jīng)常使用到這個庫,需要的朋友可以參考下2023-05-05通過實(shí)例學(xué)習(xí)Python Excel操作
這篇文章主要介紹了通過實(shí)例學(xué)習(xí)Python Excel操作,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-01-01Python對字符串實(shí)現(xiàn)去重操作的方法示例
字符串去重是python中字符串操作常見的一個需求,最近在工作中就又遇到了,所以下面這篇文章主要給大家介紹了關(guān)于Python對字符串實(shí)現(xiàn)去重操作的相關(guān)資料,文中給出了詳細(xì)的介紹,需要的朋友可以參考借鑒,下面來一起看看吧。2017-08-08使用Python中的greenlet包實(shí)現(xiàn)并發(fā)編程的入門教程
這篇文章主要介紹了使用Python中的greenlet包實(shí)現(xiàn)并發(fā)編程的入門教程,Python由于GIL的存在并不能實(shí)現(xiàn)真正的多線程并發(fā),greenlet可以做到一個相對的替換方案,需要的朋友可以參考下2015-04-04