Python之metaclass和dataclass
创始人
2024-05-30 00:17:18
0

metaclass:

MetaClass元类,本质也是一个类,但和普通类的用法不同,它可以对类内部的定义(包括类属性和类方法)进行动态的修改。可以这么说,使用元类的主要目的就是为了实现在创建类时,能够动态地改变类中定义的属性或者方法。

举个例子,根据实际场景的需要,我们要为多个类添加一个 name 属性和一个 say() 方法。显然有多种方法可以实现,但其中一种方法就是使用 MetaClass 元类。

如果在创建类时,想用 MetaClass 元类动态地修改内部的属性或者方法,则类的创建过程将变得复杂:先创建 MetaClass 元类,然后用元类去创建类,最后使用该类的实例化对象实现功能。

如果想把一个类设计成 MetaClass 元类,其必须符合以下条件:

  1. 必须显式继承自 type 类;

  1. 类中需要定义并实现 __new__() 方法,该方法一定要返回该类的一个实例对象,因为在使用元类创建类时,该 __new__() 方法会自动被执行,用来修改新建的类。

metaclass 是 type 的子类,通过替换 type的__call__运算符重载机制,“超越变形”正常的类。

一旦你把一个类型 Student 的 metaclass 设置成 Human,Student 就不再由原生的 type创建:

class Human(type):def __new__(mcs, *args, **kwargs):class_ = super().__new__(mcs, *args)for key, value in kwargs.items():setattr(class_, key, value)return class_class Student(object, metaclass=Human, country="China", freedom=True):passprint(Student.freedom)
print(Student.country)

实现一个根据props = ["name", "age"] 动态添加实例属性的metaclass:Human

class Prop:def __init__(self, attr):self._attr = f"_{attr}"def get(self, obj):if not hasattr(obj, self._attr):return Nonereturn getattr(obj, self._attr)def set(self, obj, value):setattr(obj, self._attr, value)class Human(type):def __new__(mcs, *args, **kwargs):class_ = super().__new__(mcs, *args)for property_name in class_.props:prop = Prop(property_name)prop_value = property(fget=prop.get, fset=prop.set)setattr(class_, property_name, prop_value)return class_class Student(object, metaclass=Human):props = ["name", "age"]student = Student()print(student.name)
student.name = "KbZswWtl"
print(student.name)

用装饰器的形式来进行metadata的封装:

class Prop:def __init__(self, attr):self._attr = f"_{attr}"def get(self, obj):if not hasattr(obj, self._attr):return Nonereturn getattr(obj, self._attr)def set(self, obj, value):setattr(obj, self._attr, value)class Human(type):def __new__(mcs, *args, **kwargs):class_ = super().__new__(mcs, *args)for property_name in class_.props:prop = Prop(property_name)prop_value = property(fget=prop.get, fset=prop.set)setattr(class_, property_name, prop_value)return class_def human(cls):return Human(cls.__name__, cls.__bases__, dict(cls.__dict__))class Student(object, metaclass=Human):props = ["name", "age"]@human
class Man:props = ["name", "age"]man = Man()
print(man.name)
man.name = "Tom"
print(man.name)student = Student()print(student.name)
student.name = "KbZswWtl"
print(student.name)

dataclass:

Python 内置装饰器可降低代码的复杂性和长度

Python中的面向对象编程(OOP)一直是热门话题之一。这是因为 Python 之所以出名,是因为它的灵活性和开箱即用的特性可以在很大程度上减少开发工作量,OOP 也是如此。

他们都需要利用 3rd 方库,但它们仍然是很好的解决方案。

这里介绍一个 Python 内置模块——Dataclass。它是在 Python 3.7 中引入的,它使开发人员能够以面向对象的方式进行编码,而无需任何 3rd 方库。数据类提供了开箱即用的方法来创建自定义数据, 可以直接实例化、打印和比较数据类实例。

from dataclasses import dataclass@dataclass
class Student:name: strage: ints_1 = Student()

从上面可以看出,@dataclass装饰器给我们的类中自动添加了__init__(self,name,age)函数

from dataclasses import dataclass@dataclass
class Student:name: strage: ints_1 = Student("KbZswWtl", 31)
s_2 = Student("KbZswWtl", 31)print(s_1)
print(s_2)print(s_1 == s_2)

从上面可以看出,@dataclass装饰器也给我们的类中添加了__str__、判等的函数

from dataclasses import dataclass@dataclass
class Student:name: strage: int = 18s_1 = Student("KbZswWtl")
s_2 = Student("KbZswWtl")print(s_1)
print(s_2)

从上面可以看出,@dataclass装饰器也给我们的类中添加了__init__默认值的操作

相关内容

热门资讯

安卓系统用的华为应用,探索智能... 你知道吗?在安卓系统里,华为的应用可是个宝库呢!它们不仅功能强大,而且使用起来超级方便。今天,就让我...
安卓变ios系统魅蓝 你知道吗?最近有个朋友突然告诉我,他要把自己的安卓手机换成iOS系统,而且还是魅蓝品牌的!这可真是让...
幻书启世录安卓系统,安卓世界中... 亲爱的读者们,你是否曾在某个夜晚,被一本神奇的书所吸引,仿佛它拥有着穿越时空的力量?今天,我要带你走...
电脑安装安卓系统进不去,安卓系... 电脑安装安卓系统后竟然进不去,这可真是让人头疼的问题啊!你是不是也遇到了这种情况,心里直呼“怎么办怎...
用键盘切换控制安卓系统,畅享安... 你有没有想过,用键盘来控制你的安卓手机?是的,你没听错,就是那个我们每天敲敲打打的小玩意儿——键盘。...
小米安卓镜像系统在哪,小米安卓... 你有没有想过,你的小米手机里有一个隐藏的宝藏——安卓镜像系统?没错,就是那个可以让你的手机瞬间变身成...
安卓手机下载排班系统,高效排班... 你有没有想过,每天忙碌的工作中,有没有什么好帮手能帮你轻松管理时间呢?今天,就让我来给你介绍一个超级...
桌面组件如何弄安卓系统,桌面组... 亲爱的桌面爱好者们,你是否曾梦想过将安卓系统搬到你的电脑桌面上?想象那些流畅的动画、丰富的应用,还有...
安卓13系统介绍视频,新功能与... 亲爱的读者们,你是否对安卓13系统充满好奇?想要一探究竟,却又苦于没有足够的时间去研究?别担心,今天...
车机安卓7.1系统,功能升级与... 你有没有发现,现在的车机系统越来越智能了?尤其是那些搭载了安卓7.1系统的车机,简直就像是个贴心的智...
安卓系统下如何读pdf,And... 你有没有遇到过这种情况:手机里存了一大堆PDF文件,可是怎么也找不到一个能顺畅阅读的工具?别急,今天...
安卓系统全国通用的吗,畅享智能... 你有没有想过,为什么你的手机里装的是安卓系统呢?安卓系统,这个名字听起来是不是有点神秘?今天,就让我...
假苹果手机8安卓系统,颠覆传统... 你有没有想过,如果苹果手机突然变成了安卓系统,会是怎样的景象呢?想象那熟悉的苹果外观,却运行着安卓的...
安卓12.0系统vivo有吗,... 你有没有听说最近安卓系统又升级啦?没错,就是那个让手机焕然一新的安卓12.0系统!那么,咱们国内的手...
核心芯片和安卓系统,探索核心芯... 你知道吗?在科技的世界里,有一对“黄金搭档”正悄悄改变着我们的生活。他们就是——核心芯片和安卓系统。...
如何调安卓系统屏幕颜色,安卓系... 亲爱的手机控们,你是否曾觉得安卓系统的屏幕颜色不够个性,或者是因为长时间盯着屏幕而感到眼睛疲劳?别担...
旧台式电脑安装安卓系统,轻松安... 你那台旧台式电脑是不是已经服役多年,性能逐渐力不从心,却又不忍心让它退役呢?别急,今天就来教你怎么给...
美国要求关闭安卓系统,科技霸权... 美国要求关闭安卓系统:一场技术革新还是政治博弈?在数字化时代,智能手机已经成为我们生活中不可或缺的一...
安卓系统日记本 你有没有发现,手机里的安卓系统日记本,简直就是记录生活点滴的宝藏库呢?想象每天忙碌的生活中,有没有那...
安卓手机广告最少的系统,探索安... 你有没有发现,用安卓手机的时候,广告总是无处不在,让人烦得要命?不过别急,今天我要给你揭秘一个秘密—...