Python进阶之:元类

# 几个魔术方法: __new__、__init__、__call__
# __new__: 对象的创建,是一个静态方法,第一个参数是cls;(想想也是,不可能是self,对象还没创建,哪来的self)
# __init__ : 对象的初始化, 是一个实例方法,第一个参数是self;
# __call__ : 对象可call,注意不是类,是对象。

class Bar(object):
    def __new__(cls, *args, **kwargs):
        self = super(Bar,cls).__new__(cls)
        # self = super().__new__(cls) python3
        print('__new__')
        return self

    def __init__(self,*args):
        print('__init__')
        self.name = args[0]

# 执行
b = Bar('haha')
print(b.name)


# class A(object):
#     pass
#
# a = A() # 创建类A的一个实例
#
# print(type(a))

# 创建类 type

# 定义一个函数
def func(self):
    print("汪汪")

Dog = type('Dog',(object,),dict(say=func))

dog = Dog()
dog.say()

# 元类
# 元类 ---> 类 ---> 实例

# 通过元类来修改类的属性
# 使用了__new__()修改类的属性
# class UpperMeat(type):
#     def __new__(mcls, name,bases,attrs):
#         attrs_new = dict()
#         for key,value in attrs.items():
#             if not key.startswith('__'):
#                 attrs_new[key.upper()]=value
#             else:
#                 attrs_new[key]=value
#         return type.__new__(mcls,name,bases,attrs_new)
#
# class A(metaclass=UpperMeat):
#     nAme = 'kaibin'
#
#     def fun(self):
#         print('hello')
#
# a = A()
# print(dir(A))
#
# # 在 UpperMeat 中已经修改了类A的属性,所以此处可以使用 a.FUN()
# a.FUN()

# 当需要检查类的属性时,可以使用方法__init__()
# 下面的例子通过__init__()强制类必须拥有类的文档字符串,如果没有,则抛出异常

# class NotDocException(BaseException):
#     pass
#
# class DocMeta(type):
#     def __init__(cls,name,bases,attrs):
#         if not '__doc__' in attrs.keys()\
#             or not getattr(attrs,'__doc__'):
#             raise NotDocException('Must have doc!')
#
# class A(metaclass=DocMeta):
#     """
#     This is class A.
#     """
#     pass
#
# class B(metaclass=DocMeta):
#     pass
#
# # 输出结果分析:从程序的输出不难看出,类A因为有类的文档字符串,定义成功;
# #              而类B因为没有类的文档字符串,抛出了异常。

# 元类使用 __call__() 方法【在后面有补充:Python进阶之:单例模式实现方法汇总】

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值