• 微信公众号:美女很有趣。 工作之余,放松一下,关注即送10G+美女照片!

33元类作业(单例未)

开发技术 开发技术 2周前 (04-08) 2次浏览
# obj = self.__new__(self)  # 创建一个空对象也可以指名道姓的从object.__new__(self) #但是会跳过其他子类的 直接去object里找
# self.__init__(self, args, kwargs)
# 在元类中控制把自定义类的数据属性都变成大写
# class Mymeta(type):#####注意一定要定义否者就是个普通的父类
# def __new__(cls,name,bases,attrs):
# uppper_attri={}
# for k,v in attrs.items():
# if not callable(v) and not k.startswith('__'): #callable()只是过滤掉函数方法类的实例化和类返回True #需要过滤掉内置属性
# uppper_attri[k.upper()]=v
# else:
# uppper_attri[k]=v
# return type.__new__(cls,name,bases,uppper_attri) #调用元类创建对象再吧值传入
#
#
# class Chinese(metaclass=Mymeta):
# country='China'
# tag='Legend of the Dragon' #龙的传人
# def walk(self):
# print('%s is walking' %self.name)
#
#
# print(Chinese.__dict__)
# print(callable(Chinese))


# 2、在元类中控制自定义的类无需__init__方法

# ​ 1.元类帮其完成创建对象,以及初始化操作;
#
# 2.要求实例化时传参必须为关键字形式,否则抛出异常TypeError: must use keyword argument
#
# 3.key作为用户自定义类产生对象的属性,且所有属性变成大写

# class Mymeta(type):#####注意一定要定义否者就是个普通的父类
# def __new__(cls,name,bases,attrs):
# uppper_attri={}
# for k,v in attrs.items():
# if not callable(v) and not k.startswith('__'): #callable()只是过滤掉函数方法类的实例化和类返回True #需要过滤掉内置属性
# uppper_attri[k.upper()]=v
# else:
# uppper_attri[k]=v
# return type.__new__(cls,name,bases,uppper_attri) #调用元类创建对象再吧值传入
# def __call__(self, *args, **kwargs):
# if args:
# raise TypeError('必须以关键字传参哦')
# obj=object.__new__(self)
# for k,v in kwargs.items():
# obj.__dict__[k.upper()]=v
#
# return obj #s缩进再里面第一个就给返回了 所以必须等循环完return
#
#
# class Chinese(metaclass=Mymeta):
# country='China'
# tag='Legend of the Dragon' #龙的传人
# def walk(self):
# print('%s is walking' %self.name)


# p=Chinese(name='lili',age=18,sex='male')
# print(p.__dict__)

# p=Chinese(nam='lili',age=18,haha='male')
# print(p.__dict__)


# 3、在元类中控制自定义的类产生的对象相关的属性全部为隐藏属性

class Mymeta(type):
def __init__(self, class_name, class_bases, class_dic):
# 控制类Foo的创建
super(Mymeta, self).__init__(class_name, class_bases, class_dic)

def __call__(self, *args, **kwargs):
# 控制Foo的调用过程,即Foo对象的产生过程

obj = self.__new__(self, *args, **kwargs)
self.__init__(obj, *args, **kwargs)
obj.__dict__ = {'_%s__%s' % (self.__name__, k): v for k, v in obj.__dict__.items()}

return obj


class Foo(object, metaclass=Mymeta): # Foo=Mymeta(...)
def __init__(self, name, age, sex):
self.name = name
self.age = age
self.sex = sex
def __new__(cls, *args, **kwargs):
return object.__new__(cls)

obj = Foo('lili', 18, 'male')
print(obj.__dict__)

# 4、基于元类实现单例模式

程序员灯塔
转载请注明原文链接:33元类作业(单例未)
喜欢 (0)