在Python中使用变量创建类的实例

1 投票
4 回答
618 浏览
提问于 2025-04-15 18:28

我之前在这个问题上发过帖子,但当时表达得不太清楚,回答也让我有些困惑。因为我修改了内容让它更容易理解,但似乎大家不太关注,可能是因为已经有6个回答了。所以我在这里重新发一下:


我对Python和编程还很陌生,所以需要简单的解释!我甚至不知道你们说的字典是什么东西!

我正在为我妹妹制作一个游戏。这是一个虚拟宠物的游戏,宠物有玩具可以玩。

我创建了一个叫做Toy的类,想要写一个函数getNewToy(name, data1, data2, data3, data4, data5)

我希望这个函数能创建一个新的Toy类的实例,并且我希望这个函数可以被多次调用,每次都能创建一个新的实例。

根据我的经验,创建一个实例的方法是:

class Toy:
    def __init__(self, name, data1, data2, data3, data4, data5):
        pass

myToy = Toy(myToy, 1, 2, 3, 4, 5)

然后要使用这个类的方法,可以这样:

myToy.method1()

因为我想要有多个玩具,每个玩具都有一个playWith()的方法,所以我希望每次调用的时候,实例能反映出玩具的名字。

我希望每次调用getNewToy(,...)方法时,实例都是不同的,并且能显示出玩具的名字。

记住我对编程还很新手,所以能不能把解释保持简单一点。

非常感谢,现在理解起来容易多了!

4 个回答

1

我不明白你为什么需要一个 getNewToy 方法。每次你调用 Toy() 时,都会得到你这个类的新实例。你可能想要的代码是这样的:

class Toy: 
    def __init__(self, name, data1, data2, data3, data4, data5): 
        self.name = name
        self.data1 = data1
        # ...

myToy = Toy("firsttoy", 1, 2, 3, 4, 5)
myToy2 = Toy("2ndToy", 6, 7, 8, 9, 10)
2

没必要特意去写一个叫 getNewToy 的函数。你只需要创建一个类就可以了:

 newtoy = Toy(name, data1, data2, data3, data4, data5)

这就是你需要做的全部。

“我希望每次调用这个实例时,它能显示玩具的名字。”

class Toy:
    def __repr__(self):
        return "<type Toy name=%s>" % self.name
2

这是我理解你所说的内容的方法:

# The following two classes are toys, both have a playWith 
# as you wanted, each playWith do different things
class Ball:
    def __init__(self):
        self.name = "ball"

    def playWith(self):
        print "the ball bounces"

class Car:
    def __init__(self):
        self.name = "car"

    def playWith(self):
        print "the car is fast"

# This is a Python generator, every time .next() is called on it,
# the next "yield-value" is returned
def generator():
    while True:
        yield Ball()
        yield Car()

# This is the creator, it has to be a class rather than a function
# since you wanted a new toy each time getNewToy is called
# and as such the generator needs to be tracked
class ToyCreator:
    def __init__(self):
        self.generator = generator()

    def getNewToy(self):
        return self.generator.next()

# Create five toys, print their name and play with them
# Do note here that even though we ask for five toys but only have
# two "yields" in the generator, the generator "wraps around" (since,
# internally, its just an endless loop) 
toyCreator = ToyCreator()
for i in range(5):
    toy = toyCreator.getNewToy()
    print "Toy",i,toy.name,"\t:",
    toy.playWith()

如果你对yield这个概念感到困惑,可以看看这个关于 Python生成器的文档

你想要做的其实是在实现一种设计模式,更具体来说,是一种工厂模式

还是觉得困惑吗?再读一遍,想一想,但不要犹豫,随时问我们。我们在这里帮助你。:)

撰写回答