python 元類type建立類的類 自定義元類

2021-10-07 12:59:19 字數 2337 閱讀 8275

class a:

pass

print("列印類")

print(a)

print("列印類物件")

print(a())

print("類為自己增加屬性")

a.attr1 = 10

print("類拷貝給乙個變數")

b = a

print("判斷某個屬性是否為此類的")

print(hasattr(b,"attr1"))

print("類卓偉乙個引數傳入函式")

def printclass(a):

print(a)

printclass(a)

列印類

列印類物件

<__main__.a object at 0x000001eb361d0710>

類為自己增加屬性

類拷貝給乙個變數

判斷某個屬性是否為此類的

true

類卓偉乙個引數傳入函式

結論 : 類同樣也是⼀種物件 。

# class a:

# def __init__(self):

# self.__age = 10

# self.name = ""

# def getage(self):

# return self.__age

# @staticmethod

# def smethod():

# print("靜態方法")

# @classmethod

# def cmethod(cls):

# print("類方法")

def getage(self):

return self.__age

@staticmethod

def smethod():

print("靜態方法")

@classmethod

def cmethod(cls):

print("類方法")

a = type('a',(),)#等價於上面定義的類

a = a()

print(a.getage())

a.smethod()

a.cmethod()

10

靜態方法

類方法

a = 10

type(a )# int

a.__class__#int

a.__class__.__class__#type

type 就是 python的內建元類

每個類都有乙個__metaclass__屬性 不定義那麼就指向type,故我們要之定義元類就必須改變其指向,指向我們定義的元類函式,可以將通過這個元類建立的類的屬性全部變為大寫

def mytype(cls,classname, classfather, classattrfunc):#方法一無需傳入cls

newattrfunc = {}

for name, value in classattrfunc.items():#遍歷

if not name.startswith("__"):

newattrfunc[name.upper()] = value

# 建立方法1

return type(classname, classfather, newattrfunc)

# 建立方法2

return type.__new__(cls,classname, classfather, newattrfunc)

# 建立方法3

return super(mytype,cls).__new__.(classname, classfather, newattrfunc)

# super() 函式是用於呼叫父類(超類)的乙個方法。super 是用來解決多重繼承問題的

# python 3 可以使用直接使用 super().*** 代替 super(class, self).***

class a(object,metaclass=mytype):#python 3寫法

#__metaclass__ = mytype # 設定a類的元類為mytype python2寫法

attr = "hello"

a = a()

print(hasattr(a, "attr"))

print(hasattr(a, "attr"))

Python中type()詳解 動態建立類

眾所周知 type 函式可以檢視變數的型別 先看乙個簡單的列子來看一下type檢視變數型別 class animal pass a animal print type a print type animal 可以發現我定義的animal類本身的型別是 type 從 python 直譯器的角度來看,當...

Python中type()詳解 動態建立類

眾所周知 type 函式可以檢視變數的型別 先看乙個簡單的列子來看一下type檢視變數型別 class animal pass a animal print type a print type animal class main animal class type 可以發現我定義的animal類本身...

Type類方式建立例項,呼叫類方法

由於需要做自定義控制項 使其通用化 為滿足對自定義類呼叫以及自動根據類名稱建立例項,所以想到以這種方式實現.建立type類 通過定義好的字串型的類名稱 類名稱最好具體到命名空間,方法參考 type類獲取型別方法 通過字串型的類名 使用methodinfo類 獲取類中定義的方法 例 methodinf...