物件導向反射 內建方法 元類 屬性查詢作業

2022-06-12 13:12:10 字數 2717 閱讀 7500

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類物件...