Создание экземпляра класса с переменной в Python - PullRequest
1 голос
/ 26 января 2010

У меня был этот вопрос , опубликованный ранее, но он был не очень ясен, и у меня были проблемы с ответами. Так как я отредактировал это, чтобы сделать БОЛЬШОЙ смысл, кажется, что люди не смотрели на это, возможно, потому что они видят, что у него уже есть 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 ]

2 голосов
/ 26 января 2010

Вот как бы я поступил так, как ты объяснил:

# 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 .

То, что вы пытаетесь сделать, это реализовать шаблон проектирования , фабричный шаблон , чтобы быть более точным.

Все еще чувствуете смущение? Прочитайте еще раз, подумайте немного, но не стесняйтесь спрашивать. Мы были здесь, чтобы помочь. :)

2 голосов
/ 26 января 2010

Нет смысла делать специальную функцию getNewToy. Просто создайте класс:

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

Это все, что вам нужно сделать.

"метод, который я хочу, чтобы экземпляр отражал имя игрушки каждый раз, когда вызывается."

class Toy:
    def __repr__(self):
        return "<type Toy name=%s>" % self.name
1 голос
/ 26 января 2010

Не понимаю, зачем вам метод 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)
0 голосов
/ 26 января 2010

Возможно, у вас всегда будет 5 элементов данных, но даже если это так, рассмотрите возможность использования * args:

class Toy:
    def __init__(self, name, *args):
        self.name = name
        self.data = args
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...