2015-11-26 2 views
-1
class Car: pass 

c1 = Car() 
c2 = Car() 

attr = "price" 
value = 20000 

for obj in c1,c2 : setattr(obj, attr, value) 

Это устанавливает «цену» атрибут c1 и c1 экземпляров.Может кто-то один, пожалуйста, объясните приведенный ниже код питона

Но как работает цикл for с объектом?

+0

Вы имеете в виду 'для obj в c1, c2:' part? Это всего лишь петля над кортежем. –

+1

'c1, c2' является кортежем, ваш код эквивалентен' для obj in (c1, c2): ... '. – vaultah

+0

Вы можете найти эту статью полезной: [Факты и мифы о именах и значениях Python] (http://nedbatchelder.com/text/names.html), который был написан ветеранкой SO Нед Батчелдер. –

ответ

0

Python кортежи формируются запятой:

>>> class Car: pass 
... 
>>> c1 = Car() 
>>> c2 = Car() 
>>> c1, c2 
(<__main__.Car instance at 0x1031fa368>, <__main__.Car instance at 0x1031fa290>) 
>>> type(_) # type of the last result 
<type 'tuple'> 

Скобки являются опциональный здесь; вы также можете написать кортеж как (c1, c2).

Цикл for просто выполняет итерацию по этому кортежу; цикл присваивает каждый элемент кортежа, чтобы obj для этой итерации:

>>> for obj in c1, c2: print obj 
... 
<__main__.Car instance at 0x1031fa368> 
<__main__.Car instance at 0x1031fa290> 

obj Таким образом, первый связан с Car экземпляра c1 ссылки, а затем к одному c2 ссылок.

Таким образом, петля делает следующее: obj = c1, затем obj = c2 и выполняет тело цикла после каждого такого назначения. Затем вызов setattr() устанавливает атрибут, названный в строке attr, значению, найденному в value.

+0

«Кортежи Python образованы _comma_». Есть одно исключение: 'type (())' дает мне '' (по крайней мере, в Python 3.4). – Matthias

+0

@Matthias: это потому, что единственный способ выразить пустой кортеж - использовать круглые скобки. Круглые скобки также необходимы, чтобы устранить необходимость использования запятой для кортежа в сравнении с чем-то другим, например, в вызове функции. Поэтому вам нужно использовать круглые скобки для 'type ((c1, c2))', так как 'type (c1, c2)' проходит в двух аргументах, а не в одном кортеже. –

+0

@Matthias: но по своему усмотрению '1,' является кортежем с одним элементом, а plain '1' является целым числом. –

-1
Class Car: pass 

пустая декларация класса, подобно, скажем, структура в С, то:

c1 = Car() 
c2 = Car() 

два экземпляра автомобиля, неинициализированным, затем,

attr = "price" 
value = 20000 

два переменных и, наконец,

for obj in c1, c2 : setattr(obj, attr, value) 

iter съел над ними «вспомогательный» объект, который вы используете для установки атрибутов значений в переменных для обоих экземпляров.

+1

'obj' - не какой-то отдельный« вспомогательный »объект - это просто имя, которое связано в свою очередь с объектами, которые также связаны с именами' c1' и 'c2'. Для получения дополнительной информации по этой теме, пожалуйста, см. Статью, с которой я связан в своем комментарии к вопросу. –

+0

Thnx @Alfredo .. – Ramesh