我需要一个可以定义其他类的类。例如,假设您有一个名为" Shapes"的类,您可以使用此类创建"形状"的对象。我希望能够做的是,在"形状"内,创建其他类,例如,圆形或方形。每个"子类"将具有相同的变量,例如。因此,在一天结束时,我想要定义一个叫做“汤米”的蓝色圆圈。表面积为78.5398163397 u ^ 2
在我看来,它看起来像这样:
class Shapes():
def __init__(self, myclassname):
class myclassname():
def __init__(self, color, surf_area):
self.color = color
self.surf_area = surf_area
所以要使用它你会去:
Circle = Shapes(Circle)
Tommy = Circle(blue, 78.5398163397)
我试过这个,它没有用。
任何帮助都将不胜感激。
谢谢。
编辑:
有些人似乎很困惑,我不想将一个圆形或正方形或三角形类硬编码到程序中,我希望能够在运行时定义一个新的形状。
编辑2:
我不是在寻找遗产。基本上我想要的是能够给一个类一个变量名,例如
var = Input('Enter class name')
class var(): # var as in the variable not a class called var
normal class stuff
答案 0 :(得分:0)
您正在寻找工厂模式。
快速谷歌搜索提供:
# Factory/shapefact1/ShapeFactory1.py
# A simple static factory method.
from __future__ import generators
import random
class Shape(object):
# Create based on class name:
def factory(type):
#return eval(type + "()")
if type == "Circle": return Circle()
if type == "Square": return Square()
assert 0, "Bad shape creation: " + type
factory = staticmethod(factory)
class Circle(Shape):
def draw(self): print("Circle.draw")
def erase(self): print("Circle.erase")
class Square(Shape):
def draw(self): print("Square.draw")
def erase(self): print("Square.erase")
# Generate shape name strings:
def shapeNameGen(n):
types = Shape.__subclasses__()
for i in range(n):
yield random.choice(types).__name__
shapes = \
[ Shape.factory(i) for i in shapeNameGen(7)]
for shape in shapes:
shape.draw()
shape.erase()
致http://python-3-patterns-idioms-test.readthedocs.io/en/latest/Factory.html
的信用答案 1 :(得分:0)
你必须覆盖__new__方法,因为__init__不能返回任何值,你也可以使用type函数动态构造新类,:
class Shapes(object):
def __new__(cls, class_name):
def default_init(self, color, surf_area):
self.color = color
self.surf_area = surf_area
return type(class_name, (Shapes,),
{'__init__': default_init, '__new__': super(Shapes,
cls).__new__})
# Usage:
Circle = Shapes('Circle')
Tommy = Circle('blue', 78.5398163397)
print vars(Tommy)
# {'color': 'blue', 'surf_area': 78.5398163397}
或者,相同的行为,但没有动态类创建可以通过类继承和映射字典来实现,它通过键指向类:
class Shape(object):
""" Base class for shapes. """
pass
class Circle(Shape):
def __init__(self, color, surf_area):
self.color = color
self.surf_area = surf_area
class Triangle(Shape):pass
shapes = {
'circle': Circle,
'triangle': Triangle,
}
circle = shapes['circle']('blue', 78.5398163397)
答案 2 :(得分:0)
你可以这样做:
class Shape(object):
_registry = {}
def __new__(cls, name):
if name in cls._registry:
return cls._registry[name]
class Proto(object):
def __init__(self, color, surf_area):
self.color = color
self.surf_area = surf_area
Proto.__name__ = name
cls._registry[name] = Proto
return Proto
但我完全没有看到这一点 - 你的“动态”类根本没有任何行为,并且都具有完全相同的属性集,所以你可以只使用一个单独的类并获得完全相同的行为: / p>
class Shape(object):
def __init__(self, typename, color, surf_area):
self.typename = typename
self.color = color
self.surf_area = surf_area
def __repr__(self):
return "<Shape({}) at {}>".format(self.typename, id(self))
blue_circle = Shape("Circle", "blue", 78.4222)
这个looks like a XY problem对我来说,你应该告诉我更多关于你试图解决的真正问题。