1. 程式人生 > >Python基礎(14):面向物件高階(多重繼承,定製類,列舉類,元類)

Python基礎(14):面向物件高階(多重繼承,定製類,列舉類,元類)

一,多重繼承

定義:一個子類可以繼承自多個父類

目的:同時擁有多個父類的所有功能,且減少設計層次。

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