Python基礎(14):面向物件高階(多重繼承,定製類,列舉類,元類)
阿新 • • 發佈:2019-01-02
一,多重繼承
定義:一個子類可以繼承自多個父類
目的:同時擁有多個父類的所有功能,且減少設計層次。
Mixln:某子類中,需要混入額外功能,可以通過多重繼承實現,這種設計,被叫做Mixln
二,定製類
解釋:通過魔術方法的定義,是自定義的類滿足某些特性。
__str__:呼叫print函式時,實現友好輸出。
__repr__:直接呼叫物件時,實現友好輸出。
示例:
不定義直接返回
class Student(object): pass s=Student() #例項化 s #返回結果:<write_blog.定製類.Student object at 0x000001C620AFE780> print(s) #返回結果:<write_blog.定製類.Student object at 0x000001C620AFE780>
定義以上兩個方法:
class Student(object): def __init__(self,name): self.name=name def __repr__(self): return 'my name is Student %s'%self.name def __str__(self): return 'this is a student object %s'%self.name s=Student('xiaoxinxin') #例項化 s #返回結果:my name is Student xiaoxinxin print(s) #返回結果:this is a student object xiaoxinxin
__iter__:將物件變為可迭代物件。
__getitem__:可以根據索引取物件中的值。
示例:
class Student(object):
def __iter__(self):
return self
def __getitem__(self, item):
return 'a'
s=Student()
isinstance(s,Iterable) #返回True
s[1] #返回a
__setitem__:
把物件視作list或dict來對集合賦值。
__delitem__:
用於刪除某個元素。
示例:
def __setitem__(self, key, value):
self.key=value
return self
def __delitem__(self, key):
del self.key
return self
__getattr__:物件中不包含某個屬性時,為了不使其報錯,可以定義此函式,用於友好返回。
__call__:直接用例項呼叫時,進行的操作,例如一個Student類的物件s,在用s()呼叫時,需要進行的操作。
示例:
def __getattr__(self, item):
if item=='score':
return 99
def __call__(self, *args, **kwargs):
return '為%s瘋狂打call'%self.name
三,列舉類
列舉:一個有窮序列,每一個元素是一個常數宣告。
列舉的應用場景:一個變數,有幾種常用的取值。
列舉類的主要用途:定義常量。
示例:
from enum import Enum
Month = Enum('Month', ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'))
for name, member in Month.__members__.items():
print(name, '=>', member, ',', member.value)
四,元類
定義:用metaclass函式,定義對類的某些限制。
用法:先定義一個metaclass類,裡面包含某種限制,再定義一個子類,然後利用metaclass引數,指向該元類。子類就可以實現元類中的限制。
目的:通過元類,修改類定義。
主要應用案例:ORM。
class ListMetaclass(type):
def __new__(cls, name, bases, attrs):
attrs['add'] = lambda self, value: self.append(value)
return type.__new__(cls, name, bases, attrs)
class MyList(list, metaclass=ListMetaclass):
pass