23 Python class 抽象類
抽象基類
要定義抽象基類,需要使用abc模組。該模組定義了一個元類(ABCMeta)和一組裝飾器@abstractmethod,@abstractproperty
。可以按如下方式使用
from abc import ABCMeta,abstractmethod,abstractproperty
class People:
__metaclass__ = ABCMeta
@abstractmethod
def set_name(self):
pass
@abstractproperty
def pro(self):
pass
要定義抽象類,需要將元類設定為ABCMeta
。這一步是必須的,因為抽象類的實現離不開元類。在抽象類中,@abstractmethod和@abstractproperty
裝飾的方法/特性其子類必須實現。
抽象類並不能直接例項化。
f = People() #TypeError: Can't instantiate abstract class Student with abstract methods pro, set_name
這一限制也適用於派生類。如果類Foo1繼承了Foo,但是Foo1沒有實現Foo中的抽象方法,當建立Foo1的例項時,會生成類似的錯誤。
class Student (People):
pass
f = Student() #TypeError: Can't instantiate abstract class Student with abstract methods pro, set_name
儘管抽象類會在實現的方法和特性上強制實施規則,但它不會對引數和返回值進行一致性檢查。所以,抽象類不會檢查子類是否使用了與抽象方法相同的引數和返回值。
雖然抽象類無法例項化,但是它可以決定子類中必須實現的方法和特性。而且,基類中的抽象方法/特性仍然可以從子類中呼叫。
class Student(People):
def set_name(self,name) : #引數個數不同
print super(Student,self).set_name()#呼叫基類中的抽象方法
print 'Student,set_name = %s'%name
return True #返回值不同
def pro(self,tmp = ''): #引數不同,特性->方法也是可以的,因為特性是一種特殊的函式
print super(Student,self).pro #呼叫基類中的特性
print 'Student,pro,tmp = %s'%tmp
return True #返回值不同
>>> f = Student()
>>> f.set_name('xiaohong')
None
Student,set_name = xiaohong
>>> f.pro()
None
Student,pro,tmp = Null
類註冊
抽象基類支援對已經存在的類進行註冊,使其屬於該基類,使用register()進行註冊。
如向抽象基類A註冊類B,
A.register(B)
。
向抽象基類註冊某個類時,對於註冊類的例項,涉及抽象基類的型別檢查操作(isinstance,issubclass)將返回True。
向抽象類註冊某個類時,不會檢查該類是否實現了抽象方法/特性。這種註冊隻影響型別檢查,它不會向註冊的類進行額外的錯誤檢查。
from abc import ABCMeta,abstractmethod,abstractproperty
class People(object):
__metaclass__ = ABCMeta
@abstractmethod
def set_name(self):
pass
class Foo(object):#沒有實現抽象方法set_name
pass
#print People,type(People),type(type(People)),People.__metaclass__
#print Foo,type(Foo),type(type(Foo))
f = Foo()
print isinstance(f,People) #False
print isinstance(f,Foo) #True
print issubclass(Foo,People) #False
print issubclass(Foo,object) #True
print issubclass(People,object)#True
People.register(Foo) #向People抽象基類註冊,讓Foo屬於People
print isinstance(f,People) #True
print isinstance(f,Foo) #True
print issubclass(Foo,People) #True
print issubclass(Foo,object) #True
print issubclass(People,object)#True
Python的內建型別組織到一個相對扁平的層次結構中。如int,float,可以看到他們直接繼承自所有物件的根(object),而不是表示數字的中間基類。因此很難編寫程式來根據型別檢查和操作物件。抽象類機制解決了這一難題,它允許將已存在的物件組織到使用者定義的型別層次結構中。
如果覺得本文對您有幫助,請點選‘頂’支援一下,您的支援是我寫作最大的動力,謝謝。
相關推薦
23 Python class 抽象類
抽象基類 要定義抽象基類,需要使用abc模組。該模組定義了一個元類(ABCMeta)和一組裝飾器@abstractmethod,@abstractproperty。可以按如下方式使用 from abc import ABCMeta,abstractmet
Python霧裡看花-抽象類ABC (abstract base class)
首先認識模組 abc,python中沒有提供抽象類與抽象方法,然而提供了內建模組abc來模擬實現抽象類,例如提供泛對映型別的抽象類 abc.MutableMapping 繼承abc.MutableMapping構造一個泛對映型別(類似python中的dict)
Python 定義抽象類
spa color strac bject bsp class object cnblogs print from abc import ABCMeta, abstractmethod class DataSet(object): __metacla
23.python中的類屬性和實例屬性
ash ron huang ant pass iou cli ict bin %E5%9C%A8myeclipse%E4%B8%AD%E4%BD%BF%E7%94%A8maven%E5%89%8D%E5%B8%B8%E8%A7%81%E9%94%99%E8%AF%AF%E5
python的抽象類和抽象方法
裝飾 ror 實例 imp 調用 str 定義 meta 拋出異常 class Foo(object): def exec(self): raise NotImplementedError(‘請實現exec方法‘) class A(Foo):
Python中抽象類的實現
import abc #利用abc模組實現抽象類 class All_file(metaclass=abc.ABCMeta): all_type='file' @abc.abstractmethod #定義抽象方法,無需實現功能 def read(self):
python基礎 抽象類(介面類)
Python中沒有介面。介面類,抽象類:定義 制定一個規範 #必須要匯入from abc import ABCMeta,abstractmethod class Payment(metaclass = ABCMeta): #抽象類(介面類):強制制定一個規範,凡是繼承我的類中必須有p
abstract class 抽象類與interface 介面的區別,以及應用
抽象類 特點 擁有抽象方法的類必須是抽象類 抽象類可以沒有抽象方法 繼承了抽象類的子類必須實現抽象方法,如果不實現抽象方法那麼子類必須是抽象類 抽象類中可以對方法進行宣告也可以對方法進行實現 抽象方法不能宣告為static 抽象方法不能宣告為private
python:抽象類和介面
起因 最近在寫上兩篇restframework的博文中遇到了一個問題,認證和許可權中有一個方法定義必須為固定方法名,不是的話就報錯,我當時並不知道是為什麼,以為是某種特性,也沒有深究,今天在群裡和別人聊天的時候,突然看到其他人也有這個問題,然後一查資料,發現了這
抽象類(abstract class)和接口(interface)有什麽異同?
否則 繼承 默認 strong 什麽 成員 -s 實例 abstract 相同點: 1.抽象類和接口都不能被實例化,但可以定義抽象類和接口類型的引用。 2.一個類如果繼承了抽象類和接口,必須要對其中的抽象方法全部實現。(接口中方法默認的是public abstract修飾的
Python基礎----繼承派生、組合、接口和抽象類
子類 tool study href 組合 name anim walk 年齡 類的繼承與派生 經典類和新式類 在python3中,所有類默認繼承object,但凡是繼承了object類的子類,以及該子類的子類,都稱為新式類(在python3中所有的類都是新式類) 沒有繼
python之面向對象(接口和抽象類)
抽取 高層 per 常常 typeerror app 具體細節 同仁 接口 一、接口 什麽是接口 繼承有兩種用途: 1:繼承基類的方法,並且做出自己的改變或者擴展(代碼重用)。 2:聲明某個子類兼容於某基類,定義一個接口類Interface,接口類中定義了一些接口名(就是函
Python(面向對象編程——2 繼承、派生、組合、抽象類)
eth 實例化 tails imp 可能 fun 一個 提取 *args 繼承與派生 ‘‘‘ 繼承:屬於 組合:包含 一、 在OOP程序設計中,當我們定義一個class的時候,可以從某個現有的class繼承,新的class稱為子類(Subclass),而被繼承的class
python開發面向對象基礎:接口類&抽象類&多態&多繼承
規範 函數 實現繼承 兩種 內置 依賴倒置原則 順序 兩個 歸一化 一,接口類 繼承有兩種用途: 一:繼承基類的方法,並且做出自己的改變或者擴展(代碼重用) 二:聲明某個子類兼容於某基類,定義一個接口類Interface,接口類中定義了一些接口名(就是函數名)且並未實現
Python-class類的相關總結
object 簡單 類型 編程 simpson div ogr bob class 在Python中,所有的數據類型都可以視為對象,自定義的對象數據類型就是面向對象中的類(class)的概念。 面向對象編程:object oriented programming簡稱OOP.
Python的程序結構[2] -> 類/class -> 類的特殊屬性
enter 字典 一個 pri 類屬性 __name__ attr ttr 定義 類的特殊屬性 / Special Property of Class Python 中通過 class 進行類的定義,類可以實例化成實例並利用實例對方法進行調用。 類中還包含的一些共有的特殊
python編程設計模式之接口類和抽象類
支持 不能 進行 eth bstr 單繼承 += 就會 imp 接口類 """ 接口類 是一種編程設計模式,在python原本沒有接口類 借用Java思想創建的一種規範設計模式 支持多繼承,進行多方面規範 """ 例子: fr
Java抽象類(Abstract Class)與接口(Interface)區別
調用 con mean ast his pla 一個 tree 使用場景 抽象類與接口比較 抽象類跟接口類似,都不能實例化,可能包含不需實現方法或已實現的方法。 抽象類可以定義一些不是靜態或常量的字段,定義 public, protected, private訪問級別的具
Python- 接口類-抽象類
屏幕 設計者 internet test interface %s 處理 img 設備 接口類 繼承有兩種用途: 一:繼承基類的方法,並且做出自己的改變或者擴展(代碼重用) 二:聲明某個子類兼容於某基類,定義一個接口類Interface,接口類中定義了一些接口名(就是函
python Class:獲取對象類型
oat functions example self. vpd implement add sting iter 獲取對象類型:一、type#!/usr/bin/env python3# -*- coding: utf-8 -*-class Animal(object):