日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python 抽象类分析

發布時間:2024/1/17 python 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python 抽象类分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2019獨角獸企業重金招聘Python工程師標準>>>

最近在看bottle.py源碼,里面自定了多個類字典的類。這些類的定義繼承了collections中多個抽象類。比如MutableMapping。

1、在講抽象類之前,先說下抽象方法的實現。

抽象方法是基類中定義的方法,但卻沒有任何實現。在java中,可以把方法申明成一個接口。而在python中實現一個抽象方法的簡單的方法是:

class?Sheep(object):def?get_size(self):raise?NotImplementedError

任何從Sheep繼承下來的子類必須實現get_size方法。否則就會產生一個錯誤。但這種實現方法有個缺點。定義的子類只有調用那個方法時才會拋錯。這里有個簡單方法可以在類被實例化后觸發它。使用python提供的abc模塊。

import?abc class?Sheep(object):__metaclass__?=?abc.ABCMeta@abc.absractmethoddef?get_size(self):return

這里實例化Sheep類或任意從其繼承的子類(未實現get_size)時候都會拋出異常。

因此,通過定義抽象類,可以定義子類的共同method(強制其實現)。

2、抽象類的定義。

python中,抽象類通過abc模塊實現。

import?abcclass?PluginBase(object):__metaclass__?=?abc.ABCMeta@abc.abstractmethoddef?load(self,?input):"""Retrieve?data?from?the?input?source?and?return?an?object."""return@abc.abstractmethoddef?save(self,?output,?data):"""Save?the?data?object?to?the?output."""return

具體化抽象類,可以有兩種方式,一種通過注冊(register),另外一種通過繼承。

注冊方式:

import?abc from?abc_base?import?PluginBaseclass?RegisteredImplementation(object):def?load(self,?input):return?input.read()def?save(self,?output,?data):return?output.write(data)PluginBase.register(RegisteredImplementation)if?__name__?==?'__main__':print?'Subclass:',?issubclass(RegisteredImplementation,?PluginBase)print?'Instance:',?isinstance(RegisteredImplementation(),?PluginBase)

繼承方式:

import?abc from?abc_base?import?PluginBaseclass?SubclassImplementation(PluginBase):def?load(self,?input):return?input.read()def?save(self,?output,?data):return?output.write(data)if?__name__?==?'__main__':print?'Subclass:',?issubclass(SubclassImplementation,?PluginBase)print?'Instance:',?isinstance(SubclassImplementation(),?PluginBase)

執行發現,注冊方式和繼承方式不同在于,注冊方式,當沒有實現抽象方法時,實例化時候不會報錯,但調用時候會報錯。

3、抽象類中除了抽象方法外,也可以實現抽象屬性(@abstraproperty)。

import?abcclass?Base(object):__metaclass__?=?abc.ABCMeta@abc.abstractpropertydef?value(self):return?'Should?never?get?here'class?Implementation(Base):@propertydef?value(self):return?'concrete?property'try: b?=?Base() print?'Base.value:',?b.valueexcept?Exception,?err: print?'ERROR:',?str(err)i?=?Implementation()print?'Implementation.value:',?i.value

另外子類中抽象屬性實現必須與抽象屬性定義一致。

import?abc class?Base(object):__metaclass__?=?abc.ABCMetadef?value_getter(self):return?'Should?never?see?this'def?value_setter(self,?newvalue):returnvalue?=?abc.abstractproperty(value_getter,?value_setter)class?PartialImplementation(Base):@abc.abstractpropertydef?value(self):return?'Read-only'class?Implementation(Base):_value?=?'Default?value'def?value_getter(self):return?self._valuedef?value_setter(self,?newvalue):self._value?=?newvaluevalue?=?property(value_getter,?value_setter)try: b?=?Base() print?'Base.value:',?b.valueexcept?Exception,?err: print?'ERROR:',?str(err)try: p?=?PartialImplementation() print?'PartialImplementation.value:',?p.valueexcept?Exception,?err: print?'ERROR:',?str(err)i?=?Implementation() print?'Implementation.value:',?i.valuei.value?=?'New?value'print?'Changed?value:',?i.value

4、collections

collections模塊定義了幾個抽象類。

General container classes:

  • Container

  • Sized

Iterator and Sequence classes:

  • Iterable

  • Iterator

  • Sequence

  • MutableSequence

Unique values:

  • Hashable

  • Set

  • MutableSet

Mappings:

  • Mapping

  • MutableMapping

  • MappingView

  • KeysView

  • ItemsView

  • ValuesView

Miscelaneous:

  • Callable

    python的內置類型在import collections時,會自動被注冊到這些類中。因此你可以安全的使用isinstance或issubclass來保證執行某些api

轉載于:https://my.oschina.net/u/225373/blog/201304

總結

以上是生活随笔為你收集整理的python 抽象类分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。