1、在元類中控制把自定義類的資料屬性都變成大寫
class mymeta(type):
def __new__(cls,x,y,z):#其中x為類名,y為基類,z為命名空間
class_dic = {}
for k,v in z.items():
if not callable(v) and not k.startswith('__'):
class_dic[k.upper()] = v
else:
class_dic[k] = v
return type.__new__(cls,x,y,class_dic)
class people(metaclass = mymeta):
country = 'china'
tag = '龍的傳人'
def __init__(self,name,age):
self.name = name
self.age = age
def say(self):
print('<%s:%s>'%(self.name,self.age))
print(people.__dict__)
2、在元類中控制自定義的類無需__init__方法
1)元類幫其完成建立物件,以及初始化操作;
2)要求例項化時傳參必須為關鍵字形式,否則丟擲異常typeerror: must use keyword argument
3)key作為使用者自定義類產生物件的屬性,且所有屬性變成大寫
class mymeta(type):
def __call__(cls,*args,**kwargs):
if len(args):
raise typeerror('must use keyword argument')
obj = object.__new__(cls)
for k,v in kwargs.items():
obj.__dict__[k.upper()] = v
return obj
class people(metaclass = mymeta):
country = 'china'
tag = '龍的傳人'
def singing(self):
print('[{}]正在唱: 萬里長城永不倒。。。'.format(self.name))
tank = people(name = 'tank', age = 18)
print(tank.__dict__)
tank.singing()
3、在元類中控制自定義的類產生的物件相關的屬性全部為隱藏屬性
class mymeta(type):
def __call__(self,*args,**kwargs):
people_obj = object.__new__(self)
self.__init__(people_obj,*args,**kwargs)
people_obj.__dict__=
return people_obj
class people(metaclass = mymeta):
country = 'china'
tag = '龍的傳人'
def __init__(self,name,age):
self.name = name
self.age = age
def singing(self):
print('[{}]正在唱:萬里長城永不倒。。。'.format(self._people__name))
tank = people('tank',84)
tank.singing()
print(tank.tag)
4、基於元類實現單例模式
import settings
class mymeta(type):
def __init__(self,name,bases,dic):
self.__instance = object.__new__(self)
self.__init__(self.__instance,settings.host,settings.port)
super().__init__(name,bases,dic)
def __call__(self,*args,**kwargs):
if args or kwargs:
obj = object.__new__(self)
self.__init__(obj,*args,**kwargs)
return obj
return self.__instance
class mysql(metaclass=mymeta):
def __init__(self,host,port):
self.host = host
self.port = port
obj1 = mysql()
obj2 = mysql()
obj3 = mysql()
print(obj1 is obj2 is obj3)
python 物件導向反射以及內建方法
一 反射 什麼是反射 可以用字串的方式去訪問物件的屬性,呼叫物件的方法 但是不能去訪問方法 python中一切皆物件,都可以使用放射。反射的四種方法 hasattr hasattr object.name 判斷乙個物件是否有name屬性或者是name方法。有就返回true,沒有就返回false ge...
物件,類,屬性,方法
1.類 包含資料成員和函式成員的集合,是程式設計師自己創造的又一種資料型別 2 物件中的內容分為屬性和方法兩個部分 屬性是物件中的資料成員,用於描述物件的特徵 方法是物件中的函式成員,用於描述物件的行為 3.方法與函式的區別 什麼是方法 物件中的內容分為屬性和方法兩個部分 屬性是物件中的資料成員,用...
反射dll獲取類屬性方法
assembly asb assembly.loadfrom directory.getcurrentdirectory document.dll 獲取程式集下面的document類 type document asb.gettype document.document 例項化document類物件...