Создать свойство в классе в __init__ - PullRequest
2 голосов
/ 15 августа 2011

Как я могу создать свойство для класса в init? Если я использую этот код:

In [1]: import functools
In [2]: def test(id, wrap):
   ...:     return id*2
In [3]: class A(object):
   ...:     def __init__(self, id):
   ...:         self.id = id               
   ...:         setattr(self.__class__, 'testing', property(functools.partial(test, self.id)))
In [4]: cl = []
In [5]: for i in range(5):
   ...:     cl.append(A(i))
   ...:     
In [6]: for b in cl:
   ...:     print b.testing

Я получаю:

8
8
8
8
8

Я понимаю, почему это так (потому что свойство устанавливается для класса, а не, например). Но я не понимаю, как добавить свойство к экземпляру? Если использовать self в setattr, я получаю:

<property object at 0x1018def70>
<property object at 0x1018e9050>
<property object at 0x1018e9100>
<property object at 0x1018e91b0>
<property object at 0x1018e9260>

Я читаю эту тему: Создаю свойства класса , но не понимаю, как поставить id в метакласс

1 Ответ

2 голосов
/ 15 августа 2011

Вы действительно не должны позволять экземпляру размещать свойство в своем классе. Что произойдет, если у вас много экземпляров? Каждый экземпляр переопределяет предыдущее определение свойства. (Действительно, именно поэтому вы получили пять восьмерок в опубликованном вами сообщении).

Лучше было бы:

class A(object):
    @property
    def testing(self):
        return functools.partial(test, self.id)
    def __init__(self, id):
        self.id = id               

for b in cl:
    print b.testing(1)

, что дает

0
2
4
6
8
...