Python物件導向的知識總結

巴扎黑
發布: 2017-07-23 13:44:41
原創
1789 人瀏覽過

封裝

1.為什麼要封裝?

封裝就是要把資料屬性和方法的具體實作細節隱藏起來,只提供一個介面。封裝可以不用關心物件是如何建構的

2.封裝包括資料的封裝和函數的封裝,資料的封裝是為了保護隱私,函數的封裝是為了隔離複雜度

3 .資料的封裝就是在屬性前面加上一個__

class People:def __init__(self,name,age,salary):
        self.name=name
        self.age=age
        self.__salary=salary
p=People('zhang',19,100000)print(p.name)#zhangprint(p.age)#19print(p.__salary)#AttributeError: 'People' object has no attribute '__salary'
登入後複製

咦,報錯了,讓我們打開物件的名稱空間,看看發生了什麼

print(p.__dict__)#{'name': 'zhang', 'age': 19, '_People__salary': 100000}
登入後複製

哦,原來python把__salary變形成了_People__salary,再來一遍

#
print(p._People__salary)#100000
登入後複製

所以,Python中並沒有絕對的隱藏,只要你知道了上面這個,就無所謂隱藏了

這些變形操作,只在類別的定義階段或物件定義(實例化階段)階段發生

雖然在外部無法直接存取加了__的屬性,但是在類別內部可以訪問到,可以這麼理解,在定義階段,只要遇到__開頭的,Python解釋器自動識別為_類名__屬性,所以在類內部是可以訪問到的,這樣的話,我們就可以搞一點小事情了

先來看這個

class A:def foo(self):print('from A foo')
        self.bar()def bar(self):print('from A bar')class B(A):def bar(self):print('from B bar')
b=B()
b.foo()  #from A foo
登入後複製
      #from B bar  别想多了,调用函数时别看定义位置,要看调用位置
登入後複製

如果就是想呼叫父類別的bar()函數呢?該怎麼做

class A:def foo(self):print('from A foo')
        self.__bar()def __bar(self):print('from A bar')class B(A):def __bar(self):print('from B bar')
b=B()
b.foo() #from A foo#from A bar  有没有感受到编程的享受
登入後複製

4.封裝的應用

1)不讓外界看到我們的資料屬性是怎麼定義的,只能透過我們提供的接口,看到我們允許外界看到的內容

class People:def __init__(self,name,age,height,weight,hobby):
        self.__name=name
        self.__age=age
        self.__height=height
        self.__weight=weight
        self._hobby=hobbydef tell_info(self):print('''name:%s
        age:%s
        height:%s
        weeight:%s'''%(self.__name,self.__age,
             self.__height,self.__weight))
p=People('zhang',18,1.90,75,'read')
p.tell_info()
登入後複製

2)更常用的場景是,我們可以限制資料的類型,添加自己的邏輯以後再封裝好給使用者

    def tell_name(self):print(self.__name)#修改名字def set_name(self,new):if not isinstance(new,str):raise TypeError('名字必须是字符串类型')
        self.__name=new
登入後複製

5.看我們上面的操作,用戶查看名字的時候還得p.tell_name(),本來是個資料屬性,卻被我們搞得變成了一個函數,怎麼偽裝一下呢,就可以用到property這個內建函數了

class People:def __init__(self,name,age,height,weight,hobby):
        self.__name=name
        self.__age=age
        self.__height=height
        self.__weight=weight
        self._hobby=hobby
    @propertydef name(self):return self.__namep=People('zhang',18,1.90,75,'read')print(p.name)#zhang
登入後複製

資料屬性還應該要修改,刪除操作

    @propertydef name(self):return self.__name#name已经被property修饰过,就有setter和deleter    @name.setterdef name(self,new):if not isinstance(new,str):raise TypeError('名字必须是字符串类型')
        self.__name=new
    @name.deleterdef name(self):del self.__namep = People('zhang', 18, 1.90, 75, 'read')print(p.name)#zhangp.name='can'    #修改print(p.name)#candel p.name #删除print(p.name)#AttributeError: 'People' object has no attribute '_People__name'
登入後複製

以上是Python物件導向的知識總結的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!