面向对象进阶-元类(PY高级编程系列)

面向对象进阶-元类

一般的通过引入进行创建一个类

from urllib.request import Request  # 引入模块之后 动态创建了一个 Request 类
from fake_useragent import UserAgent

r = Request('https://www.baidu.com', headers={
    'User-Agent': UserAgent().random
})  # 创建一个 Request类的实例

# <urllib.request.Request object at 0x0000016B24677E80> <class 'urllib.request.Request'>
print(r, type(r))  # 打印 Request类的实例的类型
print(Request, type(Request))  # <class 'urllib.request.Request'> <class 'type'> | 一个类的类型就是 <class 'type'>

使用 type 创建一个类

type 是一个专用于创建类的函数?? 可以查看类型或者变量的 类型
Request 就是一个类 class 数据类型就是 type
r 就是一个实例 类其数据类型就是 class Request

# 静态创建类
"""
class Person(object):
    def say(self, s='hello'):
        print('我说: %s' % s)
"""


def say(self, s='hello'):
    print('我说: %s' % s)


# 动态创建类
Person = type('Person', (object,), dict(say=say))

print(Person, type(Person))

p = Person()

print(p, type(p))

还可以使用 元类来创建一个类

# 元类 metaclass 动态创建类
# 所有的元类必须继承 type
# tm感觉好麻烦!!
class PersonMetaClass(type):
    def __new__(mcs, name, bases, dict):
        def say(self, s='hello'):
            print('我说: %s' % s)
        
        dict['say'] = say
        
        return type.__new__(mcs, name, bases, dict)


class Person(object, metaclass=PersonMetaClass):
    pass


print(Person, type(Person))

p = Person()

print(p, type(p))

有趣的规律

type 是所有类的类型

print(int.__class__, a.__class__, a.__class__.__class__)

把类属性全部改为大写

def upperAttr(name, bases, dict):
    # 遍历类中的所有的属性 把非私有属性改为大写
    newDict = {}
    
    for key, item in dict.items():
        if not key.startswith('__'):  # 过滤私有的
            newDict[key.upper()] = item
    
    return type(name, bases, newDict)


class Emp(object, metaclass=upperAttr):
    name = '张三'
    age = 18


if __name__ == '__main__':
    pass
    print(hasattr(Emp, 'name'))  # 判断类或对象实例中有这个属性
    print(hasattr(Emp, 'name'.upper()))
    print(hasattr(Emp, 'age'))
    print(hasattr(Emp, 'age'.upper()))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CY3761

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值