python高階 物件導向程式設計六 元類

2022-04-28 23:09:28 字數 3943 閱讀 7305

# typer===>produce class===>produce obj

# type稱謂元類,是所有類的類,利用type控制類的行為

# 模擬class關鍵字建立類的過程

# 建立類的兩種方式

# 方式一:

class foo:

def func(self):

print('from func')

# 方式二:

x = 1

def func(self):

print('from func')

foo=type('foo',(object,),)

# 建立類的兩種方式

# 方式一:

class foo:

x=1def run(self):

pass

print(type(foo))

# # 方式二:

class_name="bar"

def run(self):

print("%s is running"%self.name)

bases=(object,)

class_dic=

bar=type(class_name,bases,class_dic)

print(bar)

print(type(bar))

print(type("123"))

print(type(123))

# 執行結果:

# # # #

# 元類,我們重定義的元類如果不寫注釋就暴錯

class mymeta(type):

def __init__(self,class_name,class_bases,class_dic):

for key in class_dic:

if not callable(class_dic[key]):continue

if not class_dic[key].__doc__:

raise typeerror("all the func must be notes")

class foo(metaclass=mymeta):

x=1def run(self):

'所有函式必須寫注釋'

print("class foo")

foo().run()

# 一切皆物件,類也是物件,元類就是類的類

# type()內建函式可以建立類

class c(object):

pass

c=c()

print(c)

print(c)

# <__main__.c object at 0x10d41fc18>

# # type(類名, 父類的元組(可以為空), 屬性的字典)

def printinfo(self):

print("%s age %s"%(self.name,self.age))

s = type("student",(object,),)

print(type(s))

s=s()

print(type(s))

s.printinfo()

# # # adamanter age 24

# 函式type實際上是乙個元類,元類就是用來建立類的"模板"。

# 我們可以通過類"模板"建立例項物件,同樣,也可以使用元類"模板"來建立類物件;

# 也就是說,元類就是類的類.

# 建立類的過程是,__new__,__init__,建立出類來進行例項化的過程是__call__

# python2

# 在建立乙個類的時候,可以設定"__metaclass__"屬性來指定元類。

# __metaclass__ = queuemetaclass

# 屬性後面對應的就是建立類的**,可以是函式,也可以是乙個類

# 元類的查詢就是根據__metaclass__屬性一層層向父類查詢,如果找不到就用type建立類物件

# python3:

# class hello(matacalss=queuemetaclass):

# pass

def queuemeta(name, bases, attrs):

def dequeue(self):

if len(self) > 0:

return self.pop(0)

attrs['dequeue'] = dequeue

# 直接呼叫type內建函式

return type(name, bases, attrs)

# 元類從`type`型別派生

class queuemetaclass(type):

def __new__(cls, name, bases, attrs):

cls.name = name

cls.bases = bases

print("cls",cls)

print("name",cls.name)

print("bases",cls.bases)

def dequeue(self):

if len(self) > 0:

return self.pop(0)

attrs['dequeue'] = dequeue

# 直接呼叫type內建函式

# return type(name, bases, attrs)

# 通過父類的__new__方法

return type.__new__(cls, name, bases, attrs)

class myqueue(metaclass=queuemetaclass):

# 設定metaclass屬性,可以使用乙個函式,也可以使用乙個類,只要是可以建立類的**

# __metaclass__ = queuemeta

pass

q = myqueue()

print(q)

# 攔截類的建立

# 根據"__metaclass__"對應的**修改類

# 返回修改之後的類

class mymetaclass(type):

def __new__(meta, name, bases, attrs):

print('-----------------------------------')

print("allocating memory for class:", name)

print(meta)

print(bases)

print(attrs)

return super(mymetaclass, meta).__new__(meta, name, bases, attrs)

def __init__(cls, name, bases, attrs):

print('-----------------------------------')

print("initializing class:", name)

print(cls)

print(bases)

print(attrs)

super(mymetaclass, cls).__init__(name, bases, attrs)

class myclass(metaclass=mymetaclass):

def foo(self, param):

pass

myclass = myclass()

# -----------------------------------

# allocating memory for class myclass

# # ()

# # -----------------------------------

# initializing class myclass

# # ()

#

Python高階 物件導向程式設計

class user object pass按照慣例,類名以大寫字母開頭,緊接著是 object 表示該類是從 object 類進行繼承的。user user 可以在類的建構函式 init 定義類的屬性。class user object def init self,name,age self.na...

python高階 物件導向

使用類名.mro 可以檢視到下乙個呼叫的是哪個父類 import copy deftest2 a,b,args,kwargs print print a print b print args print kwargs deftest1 a,b,args,kwargs print a print b ...

高階物件導向

最基本的物件導向寫法 建立建構函式 function aaa 構造方法 aaa.prototype.showname function 使用 建立例項 var a1 new aaa a1.showname 在js原始碼中 系統物件也是基於原型的程式 function array array.prot...