在Python中使用变量创建类的实例
我之前在这个问题上发过帖子,但当时表达得不太清楚,回答也让我有些困惑。因为我修改了内容让它更容易理解,但似乎大家不太关注,可能是因为已经有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生成器的文档。
你想要做的其实是在实现一种设计模式,更具体来说,是一种工厂模式。
还是觉得困惑吗?再读一遍,想一想,但不要犹豫,随时问我们。我们在这里帮助你。:)