自定义元类控制类的实例化行为
生活随笔
收集整理的這篇文章主要介紹了
自定义元类控制类的实例化行为
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
#只是儲備 __call__方法:
# class Foo:
# def __call__(self, *args, **kwargs):
# print(self)
# print(args)
# print(kwargs)
# obj = Foo()
# obj(1, 2, 3, a = 5, g = 8)
'''
在python中一切都是對象, 此地,Foo也是對象,Foo可以加括號調用,所以 obj也可以加括號調用但是obj這個對象的類的內部必須有__call__方法,此地可以引出, Foo的元類內部也有__call__方法
'''
#Foo(1,2,3,a = 5, g = 8)就等于 Foo.__call__(Foo, 1,2,3,a = 5, g = 8) 激活type的__call__方法
class Mymeta(type):
def __init__(self, class_name, class_bases, class_dic):
# if not class_name.istitle():
# raise TypeError('首字母必須大寫')
# if '__doc__' not in class_dic or not class_dic['__doc__'].strip():
# raise TypeError('必須寫注釋且不能為空!')
# print(class_name)
# print(class_bases)
# print(class_dic)
super(Mymeta, self).__init__(class_name, class_bases, class_dic)
#print(self)
def __call__(self, *args, **kwargs): #obj = Chinese('egon', age = 25)
# print(self) #Chinese = self
# print(args) #args = 'egon'
# print(kwargs) #kwargs = 18
#第一件事:造一個空對象 obj
obj = object.__new__(self)
#第二件事:初始化 就是 __init__
self.__init__(obj, *args, **kwargs)
#第三件事:返回 對象 obj
return obj
class Chinese(object, metaclass=Mymeta):
country = 'china'
def __init__(self, name, age):
self.name = name
self.age = age
def talk(self):
print('老王的媳婦出軌啦!')
obj = Chinese('egon', 25) #相當于 Chinese.__call__(chinese, 'egon', 25)
'''
Chinese('egon', 25) 等同于 Chinese.__call__('egon', 25) 觸發__call__方法,然后創建一個空對象,然后實例化就是 __init__,最后把對象返回給調用者,就是自己定義的那個類的對象
'''
#print(obj.__dict__)
# class Foo:
# def __call__(self, *args, **kwargs):
# print(self)
# print(args)
# print(kwargs)
# obj = Foo()
# obj(1, 2, 3, a = 5, g = 8)
'''
在python中一切都是對象, 此地,Foo也是對象,Foo可以加括號調用,所以 obj也可以加括號調用但是obj這個對象的類的內部必須有__call__方法,此地可以引出, Foo的元類內部也有__call__方法
'''
#Foo(1,2,3,a = 5, g = 8)就等于 Foo.__call__(Foo, 1,2,3,a = 5, g = 8) 激活type的__call__方法
class Mymeta(type):
def __init__(self, class_name, class_bases, class_dic):
# if not class_name.istitle():
# raise TypeError('首字母必須大寫')
# if '__doc__' not in class_dic or not class_dic['__doc__'].strip():
# raise TypeError('必須寫注釋且不能為空!')
# print(class_name)
# print(class_bases)
# print(class_dic)
super(Mymeta, self).__init__(class_name, class_bases, class_dic)
#print(self)
def __call__(self, *args, **kwargs): #obj = Chinese('egon', age = 25)
# print(self) #Chinese = self
# print(args) #args = 'egon'
# print(kwargs) #kwargs = 18
#第一件事:造一個空對象 obj
obj = object.__new__(self)
#第二件事:初始化 就是 __init__
self.__init__(obj, *args, **kwargs)
#第三件事:返回 對象 obj
return obj
class Chinese(object, metaclass=Mymeta):
country = 'china'
def __init__(self, name, age):
self.name = name
self.age = age
def talk(self):
print('老王的媳婦出軌啦!')
obj = Chinese('egon', 25) #相當于 Chinese.__call__(chinese, 'egon', 25)
'''
Chinese('egon', 25) 等同于 Chinese.__call__('egon', 25) 觸發__call__方法,然后創建一個空對象,然后實例化就是 __init__,最后把對象返回給調用者,就是自己定義的那個類的對象
'''
#print(obj.__dict__)
轉載于:https://www.cnblogs.com/yuexijun/p/10324938.html
總結
以上是生活随笔為你收集整理的自定义元类控制类的实例化行为的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SoringMVC-常用注解标签详解(摘
- 下一篇: WebStorm 使用经验