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

时间:2010-01-26 07:33:32

标签: python class

我之前发过this question,但不是很清楚,我的答案也有问题。由于我编辑它以使人们更有意义,似乎人们没有看到它,也许是因为他们看到它已经有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()方法,我希望实例在每次调用时都反映Toy的名称。

每次调用方法getNewToy(,...)和实例来反映名称时,我希望实例不同。

请记住我是编程新手,所以你能解释一下吗。

非常感谢,现在更容易理解!

4 个答案:

答案 0 :(得分:2)

制作特殊的getNewToy函数毫无意义。只需创建类:

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

这就是你需要做的一切。

“方法我希望实例在每次调用时反映玩具的名称。”

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

答案 1 :(得分: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()

如果您无法理解收益业务,请查看documentation for the python generator

您要做的是实施design patternfactory pattern更准确。

仍然感到困惑?再读一遍,想一想,但不要犹豫。在这里提供帮助。 :)

答案 2 :(得分: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)

答案 3 :(得分:0)

也许您将始终拥有5个数据项,但即使如此,请考虑使用* args:

class Toy:
    def __init__(self, name, *args):
        self.name = name
        self.data = args