python面向對象

Python面向對象編程

對於Python2.7

class xxxx(object):
    pass

對於Python3.x

class xxx ():
    pass

訪問限制

  1. Python沒有訪問限制相關的強類型語法,一大半靠自覺。

  2. __xxx : 前面加了雙下劃線的代表私有類型變量,類外不能訪問。

    其實Python把__xxx打包成了 如下格式,還是可以訪問,所以說靠自覺

    _類名__xxx
    a._Student__name
  3. 下劃線開頭的實例變量名,比如_name,這樣的實例變量外部是可以訪問的,但是,按照約定俗成的規定,當你看到這樣的變量時,意思就是,“雖然我可以被訪問,但是,請把我視爲私有變量,不要隨意訪問”。

繼承和多態

看下面,一個動物類,狗繼承了它,貓繼承了它,烏龜繼承了它。

注意:子類會覆蓋父類。

根據前兩條,產生了多態,例如下面的run()函數。(還不理解的話把dog寫成int , cat寫成float ,…….)

class Animal():
    def run(self):
        print('Animal is running...')

class Dog(Animal):
    def run(self):
        print('Dog is running...')

class Cat(Animal):
    def run(self):
        print('Cat is running...')

class Tortoise(Animal):
    def run(self):
        print('Tortoise is running slowly...')

def run(animal):
    animal.run()

run(Dog())
run(Cat())
run(Tortoise())

方法

就是類裏面定義的函數

類屬性和實例屬性

類屬性:類的所有實例都可以訪問到

class Pencil():
    # length就是類屬性
    length = 22
    # self.material就是實例屬性
    def __init__(self, material):
        self.material = material
    pass

__slot__

這個類中,規定只能有哪些屬性,(調用其他屬性時候報錯)作用域只有此類,子類管不到。

@property

裝飾器,把方法裝飾成屬性。寫出更加簡潔的代碼。

class Student():
    """ hello """
    __slots__ = ("__score")

    def __init__(self):
        self.__score = 99

    @property
    def score(self):
        return self.__score

    @score.setter
    def score(self,value):
        if isinstance(value,int):
            self.__score = value
        else:
            print("error@")
            return

a = Student()
a.score = 401
print(a.score)

多重繼承

集成許多類,父類之間用逗號隔開

定製類

__len__

類可以使用len()函數

class Student():
    """ test """
    def __init__(self,*args):
        self.names = args

    def __len__(self):
        return len(self.names)

__iter__ __next__

類擁有next()方法

class Fib(object):
    """ iter test """

    def __init__(self):
        self.a, self.b = 0, 1  # 初始化兩個計數器a,b

    def __iter__(self):
        return self  # 實例本身就是迭代對象,故返回自己

    def __next__(self):
        self.a, self.b = self.b, self.a + self.b  # 計算下一個值
        if self.a > 100000:  # 退出循環的條件
            raise StopIteration()
        return self.a  # 返回下一個值

__call__

類本身可調用

class Student():
    """ __call__ test """
    def __init__(self,name):
        self.name = name
    def __call__(self):
        print("My name is %s" %self.name)

ss = Student('huajian')
ss()

__getattr__ __str__

前者用來處理類中 沒有定義的 屬性 ,,後者用來修改顯示效果。

1 . 把一個類的所有屬性和方法調用全部動態化處理了,不需要任何特殊手段(這裏只響應age)

class Student(object):

    def __getattr__(self, attr):
        if attr=='age':
            return lambda: 25
        raise AttributeError('\'Student\' object has no attribute \'%s\'' % attr)

2 . 二者結合處理網站的API , 不用一個個定義一大堆。

class Chain():
    """ __getattr__ """

    def __init__(self, path="www.baidu.com"):
        self.path = path

    def __getattr__(self, path):
        return Chain('%s/%s' % (self.path, path))

    def __str__(self):
        return self.path

    __repr__ = __str__


a = Chain()
print(a.user.qwe)
>>> www.baidu.com/user/qwe   這是輸出結果

其他__xx__

還有好多其他,不常用,不寫了。

枚舉類

常常用來設置真真的常量,因爲python中沒有const,#define之類的東西。

一般從Enum派生出自定義類:

from enum import Enum, unique


@unique裝飾器可以幫助我們檢查,保證沒有重複值
@unique
class Weekday(Enum):
    Sun = 0  # Sun的value被設定爲0
    Mon = 1
    Tue = 2
    Wed = 3
    Thu = 4
    Fri = 5
    Sat = 6


print(Weekday.Fri.value)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章