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

Python:在另一个类中定义的类,python,class,Python,Class,我需要一个可以定义其他类的类。例如,假设您有一个名为“Shapes”的类,使用该类可以创建“Shapes”对象。圆,正方形,等等。我想能够做的是,在“形状”的内部,创建其他类,例如,圆或正方形。每个“子类”都有相同的变量,例如颜色、表面积等。因此,在一天结束时,我想定义一个称为“Tommy”的蓝色圆圈,其表面积为78.5398163397 u^2 在我看来是这样的: class Shapes(): def __init__(self, myclassname): clas

我需要一个可以定义其他类的类。例如,假设您有一个名为“Shapes”的类,使用该类可以创建“Shapes”对象。圆,正方形,等等。我想能够做的是,在“形状”的内部,创建其他类,例如,圆或正方形。每个“子类”都有相同的变量,例如颜色、表面积等。因此,在一天结束时,我想定义一个称为“Tommy”的蓝色圆圈,其表面积为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

您正在寻找工厂模式

快速谷歌搜索提供:

# 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()

积分到

您必须重写_new _u方法,因为_init _u无法返回任何值,您还可以使用函数动态构造新类:

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)
您可以这样做:

但我完全不明白这一点——您的“动态”类根本没有行为,并且所有类都具有完全相同的属性集,因此您可以只使用一个类,而获得完全相同的行为:

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)
类形状(对象):
定义初始(自我、类型名称、颜色、冲浪区):
self.typename=typename
self.color=颜色
self.surf_面积=surf_面积
定义报告(自我):
返回“”。格式(self.typename,id(self))
蓝色圆圈=形状(“圆圈”,“蓝色”,78.4222)

这对我来说,你也许应该告诉我更多关于你试图用它来解决的真正问题。

你想要的是什么,在用特定语言使用它之前,你可能想了解更多。表面区域是一个非常简单的公共属性。实际上,每个形状都可能有一系列独特的属性,不是吗?因此,一个通用的类定义可能没有多大用处。为什么不简单地定义一组从
Shape
继承的子类,并使用它们各自的实现呢?也许你想要的是继承,很好地反映现实世界的概念。给类一个变量名,你想要实现什么?为什么不简单地将该名称作为一般类的变量属性,例如
Shape('circle','blue',which=42)
。它基本上实现了相同的功能,但并不疯狂。嵌套类在某些极端情况下没有什么用处。它们可能不是你想要的。您可能可以使用一个基本的
Shape
类和一个可以动态创建从Shape继承的类的普通函数,但这不需要嵌套在Shape中。不,这不是他们想要的。他们说他们需要“另一个类中的类”,但从描述来看,他们显然是在寻找简单的继承。正如我之前所说,我需要能够在运行时添加一个新形状,比如一个正方形,我不希望它硬编码。我需要能够在运行时添加一个新形状,比如一个正方形,我不希望它是硬编码的。@Rick如果一个新形状本质上只是名称不同,那么在运行时生成它又有什么好处呢?因为您不可能定义特定于形状的属性?是否要通过用户输入定义形状类?否则,您将有一组预先知道的形状,您可以预先定义这些形状。
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)