Python面向物件(一)
阿新 • • 發佈:2019-01-03
先貼一段類的程式碼
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允許多重繼承