1. 程式人生 > >23 Python class 抽象類

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):