# 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...