Python:在另一个Class中定义的类

时间:2017-09-26 11:33:04

标签: python class

我需要一个可以定义其他类的类。例如,假设您有一个名为" 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

3 个答案:

答案 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对我来说,你应该告诉我更多关于你试图解决的真正问题。