虚拟课堂:做得对吗?

2024-06-24 13:27:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在阅读描述类继承、抽象基类甚至python接口的文档。但没有什么是我想要的。也就是说,一种构建虚拟类的简单方法。当虚拟类被调用时,我希望它根据给定的参数实例化一些更具体的类,并将其交回调用函数。现在,我有一个将调用重新路由到虚拟类到底层类的摘要方法。

想法如下:

class Shape:
    def __init__(self, description):
        if   description == "It's flat":  self.underlying_class = Line(description)
        elif description == "It's spiky": self.underlying_class = Triangle(description)
        elif description == "It's big":   self.underlying_class = Rectangle(description)
    def number_of_edges(self, parameters):
        return self.underlying_class(parameters)

class Line:
    def __init__(self, description):
        self.desc = description
    def number_of_edges(self, parameters):
        return 1

class Triangle:
    def __init__(self, description):
        self.desc = description
    def number_of_edges(self, parameters):
        return 3

class Rectangle:
    def __init__(self, description):
        self.desc = description
    def number_of_edges(self, parameters):
        return 4

shape_dont_know_what_it_is = Shape("It's big")
shape_dont_know_what_it_is.number_of_edges(parameters)

我的重新路由远不是最优的,因为只传递了对number_of_edges()函数的调用。在形状中添加类似的内容也不会起到作用:

def __getattr__(self, *args):
    return underlying_class.__getattr__(*args)

我做错什么了?整个想法执行得不好吗?非常感谢您的帮助。


Tags: of方法self路由numberreturninitdef
3条回答

Python没有现成的虚拟类。您必须自己实现它们(这应该是可能的,Python的反射功能应该足够强大,可以让您这样做)。

但是,如果您需要虚拟类,那么为什么不使用一种编程语言,它确实有虚拟类,如Beta、gBeta或Newspeak?(顺便问一下:还有其他的吗?)

不过,在这个特定的例子中,我并没有看到虚拟类如何简化您的解决方案,至少在您给出的示例中没有看到。也许你可以解释一下为什么你认为你需要虚拟课程?

别误会:我喜欢虚拟类,但事实上,只有三种语言实现过它们,只有其中一种仍然存在,而且这三种语言中的0种实际上被任何人使用,这多少说明了

我更喜欢和工厂合作:

def factory(description):
    if   description == "It's flat":  return Line(description)
    elif description == "It's spiky": return Triangle(description)
    elif description == "It's big":   return Rectangle(description)

或:

def factory(description):
    classDict = {"It's flat":Line("It's flat"), "It's spiky":Triangle("It's spiky"), "It's big":Rectangle("It's big")}
    return classDict[description]

从Shape继承类

class Line(Shape):
    def __init__(self, description):
        self.desc = description
    def number_of_edges(self, parameters):
        return 1

我同意TooAngel,但我会使用__new__ method

class Shape(object):
    def __new__(cls, *args, **kwargs):
        if cls is Shape:                            # <-- required because Line's
            description, args = args[0], args[1:]   #     __new__ method is the
            if description == "It's flat":          #     same as Shape's
                new_cls = Line
            else:
                raise ValueError("Invalid description: {}.".format(description))
        else:
            new_cls = cls
        return super(Shape, cls).__new__(new_cls, *args, **kwargs)

    def number_of_edges(self):
        return "A shape can have many edges…"

class Line(Shape):
    def number_of_edges(self):
        return 1

class SomeShape(Shape):
    pass

>>> l1 = Shape("It's flat")
>>> l1.number_of_edges()
1
>>> l2 = Line()
>>> l2.number_of_edges()
1
>>> u = SomeShape()
>>> u.number_of_edges()
'A shape can have many edges…'
>>> s = Shape("Hexagon")
ValueError: Invalid description: Hexagon.

相关问题 更多 >