1. 程式人生 > >Python面向物件(一)

Python面向物件(一)

先貼一段類的程式碼


class Animal(object):
    # 類屬性
    type = 'Animal'
    # 私有類屬性
    __count = 0

    def __init__(self, name, sex=True):
        # 例項屬性
        self.name = name
        # 私有例項屬性
        self.__sex = sex

        Animal.__count += 1

    def say(self):
        pass

    def __str__(self):
        return
"I'm a %s,My name is %s, male:%s" % (self.type, self.name, self.__sex) class Cat(Animal): # 類屬性 type = 'Cat' def __init__(self, name, sex=True): super().__init__(name=name, sex=sex) def say(self): print("miao miao miao") if __name__ == '__main__': cat1 = Cat('mimi'
) cat2 = Cat('mama') cat1.say() print(cat1) print(isinstance(cat1, Cat), isinstance(cat1, Animal), type(cat1)) # 訪問例項屬性 print(cat1.type) # 修改例項屬性 cat1.type = 'cat1' # 訪問修改後的例項屬性 print(cat1.type) # 訪問類屬性 print(Cat.type) # 強制訪問例項私有屬性 print(cat1._Animal__sex) # 強制訪問類私有屬性
print(Cat._Animal__count) # 輸出 # shell> miao miao miao # shell> I'm a Cat,My name is mimi, male:True # shell> True True <class '__main__.Cat'> # shell> Cat # shell> cat1 # shell> Cat # shell> True # shell> 2

基礎知識點

  • 類屬性:定義在類內部,使用類訪問
  • 例項屬性:定義在類內部,並通過self或者例項訪問
  • 開頭為兩個下劃線的屬性表示私有屬性(如:self.__type),原則上只有類和例項自己能訪問,其實外面也能訪問,使用:下劃線+類名+屬性名(如:_Animal__type)這種方式強制訪問
  • 判斷型別使用:type()和isinstance(),isinstance可以判斷包括父類在內的型別
  • set/get方法:使用@property裝飾器,設定屬性的set/get方法
class Animal(object):
    @property
    def sex(self):
        return self.__sex

    @sex.setter
    def sex(self, sex):
        if not isinstance(sex, bool):
            raise ValueError('name must be True or False!')
        self.__sex = sex

特殊方法

  • __init__()
    初始化屬性
    子類使用super().__init__函式呼叫父類建構函式
  • __slots__()
    定義允許繫結的屬性集合
class Animal(object):
    __slots__ = ('name', 'age', 'type') 
  • __str__()與__repr__()
    定製例項的字串
  • __iter__與__next__()
    實現__next__方法的類稱為迭代器,實現__iter__方法,其返回一個迭代器,稱為可迭代物件,可用於for…in語法(詳情見此

  • __getitem__
    實現此方法,即擁有類似list的行為,可通過下標訪問,

  • __getattr__
    獲取類屬性的自定義方法,此方法有很多巧妙的用法
class Chain(object):

    def __init__(self, path=''):
        self._path = path

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

    def __str__(self):
        return self._path

    __repr__ = __str__

# 測試結果
# >>> Chain().status.user.timeline.list
# '/status/user/timeline/list'
  • __call__
    實現此方法的類,它的例項是一個可呼叫物件,可以向函式一樣使用此類的一個物件
 class Student(object):
    def __init__(self, name):
        self.name = name

    def __call__(self):
        print('My name is %s.' % self.name)


# >>> s = Student('Michael')
# >>> s()
# My name is Michael.
# >>> callable(s)   # callable()函式判斷是否是可呼叫物件
# True

列舉類

from enum import Enum, unique

@unique     # 用來檢查重複值
class Weekday(Enum):
    Sun = 0
    Mon = 1
    Tue = 2
    Wed = 3
    Thu = 4
    Fri = 5
    Sat = 6

if __name__ == '__main__':
    sat = Weekday.Sat
    print(sat)
    print(sat.value)
    print(Weekday(3))

# 輸出
# shell>  Weekday.Sat
# shell>  6
# shell>  Weekday.Wed

其他特性

  • python允許多重繼承