【发布时间】:2021-02-22 10:02:44
【问题描述】:
我一直在观看一些关于装饰器和元类的视频,我想我现在对它们有了更好的理解。我拿走的一个格言是“如果你可以在不使用元类的情况下更简单地做到这一点,就不要使用元类”。前段时间我写了一个元类,但并没有真正理解我在做什么,我回去复习了它。我很确定我在这里做了一些明智的事情,但我想我会检查一下......
PS 我有点担心在 Metaclass 定义中使用了 Color 类,我觉得应该在 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)
编辑:我意识到我可以编写 Color 类,以便 Colour("red") 等同于 Colours.red 但当时觉得使用 Colours.red 更优雅,并添加了 Color 'red ' 是一个常数,而不是必须查找并且可以变化的东西。
【问题讨论】: