gpt4 book ai didi

python - python 中的类是否可以根据传递的参数表现得像指定的类?

转载 作者:太空宇宙 更新时间:2023-11-04 10:26:30 24 4
gpt4 key购买 nike

我有一个抽象基类(下面称为 Shape)。我从中派生了几个类(下面的 CircleSquare)。

我想创建一个“调度类”(下面称为 MagicShape),这样当我实例化这个新类的新对象时,它会神奇地成为上面基于传递的参数。

即如果 CircleSquare 都用 2 个参数初始化,我希望 MagicShape 在实例化时采用 3 个参数,这样第一个参数要么是字符串 circle 或字符串 square 并会导致使用随后指定的参数创建 CircleSquare

具体来说,我有:

from numpy import pi as PI

class Shape(object):
def __init__(self, color, size):
self.color=color
self.size = size

def describe(self):
return 'I am a {color:s} {kind:s} of size {size:0.1f}'.format(color=self.color,
kind=self.kind,
size=self.size)

class Circle(Shape):
def __init__(self, color, size):
self.kind = 'circle'
super(Circle, self).__init__(color, size)

def area(self):
return PI * self.size * self.size

class Square(Shape):
def __init__(self, color, size):
self.kind = 'square'
super(Square, self).__init__(color, size)

def area(self):
return self.size * self.size

我想要这样的东西:

class MagicShape(???):
def __init__(self, kind, color, size):
# what goes in here?

所以当我运行 ms = MagicShape('circle', 'red', 3) 时,ms 是一个 Circle 但是当我运行 ms = MagicShape('square', 'blue', 2)ms 是一个 Square

我知道我可以做这样的事情:

def make_shape(kind, color, size):
if 'circle'==kind:
return Circle(color, size)
elif 'square'==kind:
return Square(color, size)
else:
raise ValueError

并通过函数进行"dispatch"。但不知何故,这感觉应该可以通过类(class)来实现。有人可以让我直截了当吗?

最佳答案

你可以只使用一个函数,不需要类:

shapes = {shape.__name__.lower(): shape 
for shape in Shape.__subclasses__()}

def MagicShape(kind, color, size):
try:
return shapes[kind](color, size)
except KeyError:
raise ValueError(kind)

class.__subclasses__() method这里返回 Shape 的所有子类,从而提供一种快速便捷的方法来构建从 kind 字符串到类的映射。

请记住,创建类只是另一个调用。两者之间没有区别:

class Foo(object):
def __init__(self, arg1, arg2):
pass

def Foo(arg1, arg2):
return something_that_is_an_instance

从调用者的角度;他们只会使用:

result = Foo(value1, value2)

对于类和函数。

关于python - python 中的类是否可以根据传递的参数表现得像指定的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29085681/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com