(1)通過分支語句動態建立類
因為類也是物件,執行時在函式中使用class關鍵字動態的建立類。當使用class關鍵字時,python直譯器自動建立這個物件。
#通過分支語句動態建立類
defcreate_class
(name)
:if name==
'foo'
:class
foo(
object):
pass
return foo
else
:class
bar(
object):
pass
return bar
cls=create_class(name=
'fool'
)print
(cls.__name__)
#獲取類的方法
結果
bar
(2)通過type動態建立類
語法格式:
type(類名,父類名稱的元組,屬性資訊的字典)
#通過type動態建立類
defhello
(self)
:print
('hello'
)person=
type
('person',(
object,)
,)p1=person(
)print
(p1.country)
p1.hello(
)
結果
china
hello
(3)自定義元類metaclass
應用場景:django(orm)、元類實現單例模式等
元類本身而言,實現的功能是:1.攔截類的建立 2.修改類 3.返回修改之後的類
#通過metaclass自定義元類
class
singleton
(type):
"""自定義元類實現單例模式,父類時type"""
cache=
def__call__
(cls)
:if cls not
in cls.cache:
cls.cache[cls]
=super
(singleton, cls)
.__call__(
)# 如果類不在類儲存中,則使用父類的__call__方法建立類,這裡cls是因為要繼承的是類方法,不是例項
return cls.cache[cls]
#建立乙個類person,指定person的類(元類)是singleton
class
person
(object
,metaclass=singleton)
:pass
p1=person(
)p2=person(
)print
(p1,p2)
結果
<__main__.person object at 0x00000246f074d9e8
>
<__main__.person object at 0x00000246f074d9e8
>
#結果顯示建立的是單例模式
PHP物件導向高階特性
1 在 任何處直接使用,不需要在物件中傳遞例項 2 每個例項都可以訪問類中的靜態屬性。不用為了獲取簡單的功能而例項化物件 3 在靜態方法中例項物件進行操作,那麼在不例項化的情況下獲取新的物件 4 靜態變數可以通過類修改,但常量不可改 類的屬性改變會影響它所有的例項 class parents a n...
物件導向高階特性之 抽象基類
import abc class human metaclass abc.abcmeta 基類,定義乙個抽象類 abc.abstractmethod defintroduce self print introduce.abc.abstractmethod defhello self print he...
物件導向高階特性部分總結
繼承規則 在構造方法中,呼叫構造方法可以使用this和super關鍵字。package test2 author xiaochen public class animal public animal string string public void test package test2 autho...