2011-12-30 3 views
1

Пробовал следующее, где «objectname» содержит имя строки, которое должно быть назначено при создании объекта.Как назначить переменную имени объекта?

for record in result: 
    objectname = 'Customer' + str(record[0]) 
    print objectname 
    customername = str(record[1]) 
    objectname = Customer(customername) 

Где Клиент является классом.

В моем тесте этот цикл работает дважды с именем «objectname» как Customer1 и Customer2, но создает 2 объекта, но объекты называются «objectname» (он перезаписывает каждый цикл), противоположный двум уникальным объектам Customer1 или Customer2 ,

Его просто не назначают строки (customer1,2) внутри переменной, а просто имена переменных.

Я пытался присваивать строки с именем объекта, но это дает синтаксической ошибке,

Конечно, это должно быть сделано все время, спасибо за вашу помощь заранее.

+0

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * На самом деле, это довольно ужасный способ сделать это. Просто используйте коллекцию. – delnan

+0

Исправьте отступ в вашем примере кода. Знаете, это важно в Python. –

+0

Спасибо всем за ответы и за то, что они относятся к моим новичкам знания Python. – user1123221

ответ

3

Вместо того, чтобы использовать новую переменную для каждого клиента вы можете сохранить свой объект в словаре Python:

d = dict() 

for record in result: 
    objectname = 'Customer' + str(record[0]) 
    customername = str(record[1]) 
    d[objectname] = Customer(customername) 

print d 

Пример объектов, хранящихся в словарях

Я просто could'nt помочь моей самостоятельной Writting некоторый код (больше, чем я намеревался сделать). Это похоже на привыкание. Во всяком случае, я бы не использовал объекты для такого рода работ. Я, вероятно, буду использовать базу данных sqlite (может быть сохранена в памяти, если вы хотите). Но этот кусок кода показать вам (надеюсь), как вы можете использовать словари, чтобы сохранить объекты с данными о клиентах в:

# Initiate customer dictionary 
customers = dict() 

class Customer: 
    def __init__(self, fname, lname): 
     self.fname = fname 
     self.lname = lname 
     self.address = None 
     self.zip = None 
     self.state = None 
     self.city = None 
     self.phone = None 

    def add_address(self, address, zp, state, city): 
     self.address = address 
     self.zip = zp 
     self.state = state 
     self.city = city 

    def add_phone(self, number): 
     self.phone = number 


# Observe that these functions are not belonging to the class.  
def _print_layout(object): 
     print object.fname, object.lname 
     print '===========================' 
     print 'ADDRESS:' 
     print object.address 
     print object.zip 
     print object.state 
     print object.city 
     print '\nPHONE:' 
     print object.phone 
     print '\n' 

def print_customer(customer_name): 
    _print_layout(customers[customer_name]) 

def print_customers(): 
    for customer_name in customers.iterkeys(): 
     _print_layout(customers[customer_name]) 

if __name__ == '__main__': 
    # Add some customers to dictionary: 
    customers['Steve'] = Customer('Steve', 'Jobs') 
    customers['Niclas'] = Customer('Niclas', 'Nilsson') 
    # Add some more data 
    customers['Niclas'].add_address('Some road', '12312', 'WeDon\'tHaveStates', 'Hultsfred') 
    customers['Steve'].add_phone('123-543 234') 

    # Search one customer and print him 
    print 'Here are one customer searched:' 
    print 'ooooooooooooooooooooooooooooooo' 
    print_customer('Niclas') 

    # Print all the customers nicely 
    print '\n\nHere are all customers' 
    print 'oooooooooooooooooooooo' 
    print_customers() 
+0

Ну, у Rotem, который использовал то же самое решение, что и у меня, было лучшее имя для словаря - «клиенты». В противном случае они почти одинаковы :) –

+0

извините, начал писать, пока вы писали свои, это, очевидно, тот же ответ. – Rotem

+0

Спасибо за ответ и ваше время, я вижу, что вы создаете словарь, но похоже, что вы назначаете объект в словарь, не вставляя значение в словарь, а затем проверяя его на объект. Это, очевидно, правильный способ сделать это, но для меня это кажется интуитивно понятным ..: S – user1123221

1

Что вам нужно, это словарь:

customers = {} 
for record in result: 
    objectname = 'Customer' + str(record[0]) 
    customers[customername] = Customer(str(record[1])) #assignment to dictionary 
+0

Спасибо за ответ и ваше время, я вижу, что вы создаете словарь, но похоже, что вы назначили объект в словарь, против поместить значение в словарь и затем проверить это на объект. Это, конечно, правильный способ сделать это, но кажется мне интуитивным ..: S – user1123221

+0

Я не могу представить, каким образом это кажется более сложным или контр-интуитивным, но для каждого из его собственных я думаю .. – Rotem

2

Это, как правило, не так уж полезно иметь динамически сгенерированные имена переменных. Я определенно предложил бы что-то вроде ответа Никласа вместо этого, но если вы знаете, это то, что вы хотите здесь, как вы можете это сделать:

for record in result: 
    objectname = 'Customer' + str(record[0]) 
    print objectname 
    customername = str(record[1]) 
    exec '%s = Customer(%r)' % (customername, customername) 

Это приведет к переменным Customer1 и Customer2 добавляется к внутренней сфере , так же, как если бы вы выполнены следующие строки:

Customer1 = Customer('Customer1') 
Customer2 = Customer('Customer2') 

Когда делают это таким образом, вы должны убедиться, что customername является valid Python identifier.

+0

Спасибо за помощь в этом! – user1123221

+0

Это помогает мне лучше понять общую идею! – user1123221

Смежные вопросы