这是元类的有效使用吗

  • 本文关键字:有效 python metaclass
  • 更新时间 :
  • 英文 :


我一直在看一些关于decorator和元类的视频,我想我现在更了解它们了。我去掉的一句格言是";如果你可以在不使用元类的情况下更简单地做到这一点,就不要使用元类;。前段时间,我写了一个元类,但我并不真正理解我在做什么,我回去复习了一下。我很确定我在这里做了一些明智的事情,但我想我应该检查一下。。。。

PS我有点担心Colour类在Metaclass定义中使用,我觉得它应该在class级别使用,但这会使代码复杂化。

import webcolors
# This is a holding class for demo purposes
# actual code allows much more, eg 0.3*c0 + 0.7*c1
class Colour(list):
def __init__(self,*arg):
super().__init__(arg)
# define a metaclass to implement Class.name
class MetaColour(type):
def __getattr__(cls,name):
try:
_ = webcolors.name_to_rgb(name)
return Colour(_.blue,_.green,_.red)
except ValueError as e:
raise ValueError(f"{name} is not a valid name for a colour ({e})")
return f"name({name})"
# a class based on the metaclass MetaColour
class Colours(metaclass=MetaColour):
pass

print("blue = ",Colours.blue)
print("green = ",Colours.green)
print("lime = ",Colours.lime)
print("orange = ",Colours.orange)
print()
print("lilac = ",Colours.lilac)

编辑:我意识到我本可以写Colour类,这样Colour("red"(就相当于Colors.red,但当时我觉得使用Colors.red更优雅,并添加了颜色"red"是一个常量的含义,而不是必须查找并且可以变化的东西。

如果你真的需要Colours作为一个类,那么这个元类就可以完成它的工作——而且看起来很好。在其内部使用CCD_ 2完全没有问题;元类代码不能使用任何"普通"类"-它通常是Python代码。

我想说的是,也许你不需要使用Colours作为一个类,而只需要创建一个Colours类,包含你需要的所有功能,并创建它的一个实例。代码的其余部分将使用这个实例而不是Colours类。

是的,单个实例是";单例模式"-但与一些复杂的代码不同,你可以在如何制作你的类";成为单身者";(包括一些广泛传播的关于在Python中需要一个元类来拥有一个singleton的坏做法(,你只需创建实例,将其分配给一个名称,然后就可以完成了;webcolors";对象。

为了获得额外的singleton奖励,您可以将Colours的单个实例命名为Colours,并对该类进行阴影处理,以防止意外使用该类而不是该实例。

(而且,尽管这可能是显而易见的,但为了完整性:在"使用Colours作为实例"的情况下,根本不需要这个元类——相同的__getattr__方法进入类主体(

当然,同样,如果你有彩色作为一个类的用途,这个设计没有问题。

最新更新