自定义元类

自定义元类

通过传入不同的字符串动态的创建不同的类
def dynamic(name):
    if name == 'user':
        class User:
            def __str__(self):
                return 'user'
        return User


if __name__ == '__main__':
    d = dynamic('user')
    my_obj = d()
    print(my_obj)
    print(type(my_obj))

用type创建

python官方文档中,type()类有两个功能,一个是返回对象的类型,一个是返回一个新的类(用type创建的类)

# type(name, bases, dict) -> a new type
user = type('User', (), {'name': 'shell', 'age': 18})

if __name__ == '__main__':
    print(user().name, user().age)
    print(type(user))

# shell 18
# <class 'type'>

还可以定义属性

# 一定要带self,因为在类中这是一个方法,方法需要self参数
def hello(self):
    return 'hello reader'


# type(name, bases, dict) -> a new type
user = type('User', (), {'name': 'shell', 'age': 18, 'hello': hello})
u = user()

if __name__ == '__main__':
    print(u.hello())

使用type创建类并继承类
class BasesClass:
    def follow(self):
        return 'follow me'

# 一定要带self,因为在类中这是一个方法,方法需要self参数
def hello(self):
    return 'hello reader'
    

user = type('User', (BasesClass,), {'name': 'shell', 'age': 18, 'hello': hello})
u = user()


if __name__ == '__main__':
    print(u.follow())

# follow me

什么是元类

通俗来说,元类就是创建类的模板

为什么type能用来创建类?因为它本身是一个元类。

type是Python在背后用来创建所有类的元类,我们熟知的类的始祖 object 也是由type创建的。更有甚者,连type自己也是由type自己创建的

在实际编码中,一般不使用type去创建类,而是用元类的写法,自定义一个原来metaclass去创建

class BaseClass(type):
    def __new__(cls, *args, **kwargs):
        return super().__new__(cls, *args, **kwargs)


class User(metaclass=BaseClass):
    def __init__(self, name):
        self.name = name

    def __str__(self):
        return 'text'


if __name__ == '__main__':
    u = User('shell')
    print(u)
    
使用元类的意义
  • 拦截类的创建
  • 拦截后,进行修改
  • 修改后返回修改的类

参考文章:https://www.cnblogs.com/derek1184405959/p/9043472.html

https://www.cnblogs.com/wongbingming/p/8973859.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值