Python面向對象編程
類
對於Python2.7
class xxxx(object):
pass
對於Python3.x
class xxx ():
pass
訪問限制
Python沒有訪問限制相關的強類型語法,一大半靠自覺。
__xxx : 前面加了雙下劃線的代表私有類型變量,類外不能訪問。
其實Python把__xxx打包成了 如下格式,還是可以訪問,所以說靠自覺
_類名__xxx a._Student__name
下劃線開頭的實例變量名,比如
_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)