4-面向?qū)ο缶幊?/h2>

python中包的引用是一個(gè)坑,經(jīng)常出現(xiàn)這個(gè)文件夾的代碼,引用不到另一個(gè)文件夾的代碼,這個(gè)時(shí)候就必須要去更改環(huán)境變量,無(wú)論如何,總感覺(jué)不是一種優(yōu)雅的做法,為了避免這樣的情況出現(xiàn),做好項(xiàng)目目錄結(jié)構(gòu)就顯得十分的重要。以 dirsearch 這樣的工具為例


1600893136-5c3496614c07d_articlex.png

一般項(xiàng)目,我們需要設(shè)置一個(gè)入口文件,用來(lái)運(yùn)行代碼,而實(shí)現(xiàn)主要功能的,我們可以分散在其他文件夾里面,這樣一來(lái),我們就可以跨文件夾調(diào)用代碼了,因?yàn)檫@些功能代碼不是主要運(yùn)行文件。

面向?qū)ο?/h1>

Python面對(duì)對(duì)象的實(shí)現(xiàn),采用的是“鴨子模型”的方式,什么是鴨子模型,一個(gè)動(dòng)物,只要它叫聲像鴨子,走路像鴨子,行為舉止動(dòng)作思想等等方面像鴨子,那么在python里面,就說(shuō)明這是一只鴨子。 怎么理解呢? 比如說(shuō),Iterator 對(duì)象是因?yàn)閮?nèi)部有一個(gè)iter方法,所以才被稱(chēng)之為Iterator 對(duì)象,所以在python里面,只要聲明一個(gè)對(duì)象,并且實(shí)現(xiàn)了iter 方法,那么聲明的這個(gè)對(duì)象就是 Iterator 對(duì)象。

聲明對(duì)象

class Student(object):
    # 構(gòu)造函數(shù),創(chuàng)建實(shí)例需要用到
    def __init__(self):
        pass 

訪(fǎng)問(wèn)限制

封裝性是面向?qū)ο蟮囊淮筇攸c(diǎn),如果要內(nèi)部屬性不被外部調(diào)用,需要加上 __ 兩個(gè)下劃線(xiàn)

class Student(object):
     def __init__(self,name):
         self.__name = name

這樣就沒(méi)辦法直接通過(guò)實(shí)例來(lái)訪(fǎng)問(wèn)這個(gè)變量了

>>> bart = Student('Bart Simpson')
>>> bart.__name
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'Student' object has no attribute '__name'

因?yàn)檫@個(gè)時(shí)候,__name 變量已經(jīng)被隱式的變成了 _Student__name

繼承

繼承的一般寫(xiě)法為:

class Animal(object):
    pass
    
class Cat(Animal):
    pass

所有的類(lèi)都繼承于 object 這個(gè)類(lèi)。所要注意的是,在繼承父類(lèi)的時(shí)候,也會(huì)同時(shí)繼承其構(gòu)造函數(shù),但是如果要給子類(lèi)添加一些新的屬性時(shí)候要怎么辦? 比如說(shuō)父類(lèi)是一個(gè)比較模糊的名詞,Animal,創(chuàng)建的實(shí)例Cat要有一個(gè)名字 name,這個(gè)時(shí)候,name就是子類(lèi)新的屬性。例子:

class Animal(object):
    def __init__(self,feather):
        self.feather = feather
    # 是否有羽毛
    def is_feather(self):
        return self.feather

class Bird(Animal):
    def __init__(self,name,age,*args,**kw):
        self.name = name
        self.age = age
        super(Bird,self).__init__(*args,**kw)
    
    def is_feather(self):
        return self.feather

多態(tài)

因?yàn)槭区喿宇?lèi)型,所以多態(tài)也不是嚴(yán)格意義上的多態(tài)。 只是一個(gè)參數(shù)上的形式而已。

使用slots

使用 slots 可以 限制類(lèi)的實(shí)例賦值,比如,要限制 Student 的實(shí)例,只能添加 name 和 age 兩個(gè)屬性,其他的不允許,就可以這么做:

# coding: utf-8 
class Student(object):
    __slots__ = ('name', 'age') # 用tuple定義允許綁定的屬性名稱(chēng)
    def __init__(self):
        pass
   
if __name__ =="__main__":
    s = Student()
    s.scope = 100
# 輸出:  AttributeError: 'Student' object has no attribute 'scope' 

使用@property

這個(gè)屬性主要是針對(duì)對(duì)象的封裝性的,對(duì)象的屬性一般是不應(yīng)該通過(guò)實(shí)例直接來(lái)設(shè)置,一般還需要設(shè)置 get 和 set 方法。 @property 就是這么來(lái)使用的。例子

class Student(object):
    @property
    def score(self):
        return self._score
        
    @score.setter
    def score(self, value):
        if not isinstance(value, int):
            raise ValueError('score must be an integer!')
        if value < 0 or value > 100:
            raise ValueError('score must between 0 ~ 100!')
        self._score = value

參考

https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014318645694388f1f10473d7f416e9291616be8367ab5000

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容