Я только начал изучать питон и очень смущен тем, почему я могу это сделать. Будет ли кто-нибудь, пожалуйста, объясните, почему это работает:Свойства/атрибуты класса Python
class foo():
@property
def hello(self):
return "hello world"
if __name__ == '__main__':
cli = foo()
cli.foo2 = 3
print cli.hello #prints hello world
print cli.foo2 #prints 3
Это не имеет смысла для меня, что я могу создать новый атрибут и присвоить значение, если оно не существует в исходном классе. Есть ли способ предотвратить это поведение или может кто-то хотя бы объяснить логику этого?
-edit- Я рад, что это нормальное поведение для объектов в python, и я не просто делал что-то неправильно. Это просто не понравилось, поскольку я обычно работаю в VBA и C#. Из того, что другие сказали в ответах ниже, я думал, что добавление слотов помешает чему-либо добавить к классу таким образом, но, возможно, я не понял.
class foo():
@property
def hello(self):
return "hello world"
__slots__ = []
if __name__ == '__main__':
cli = foo()
cli.foo2 = 3
print cli.hello #prints hello world
print cli.foo2 #prints
я попробовал это, и это не работает для меня (как и ожидалось) - ни cli.foo, ни cli.foo2 определено. –
@AMADANON: Это немного странно. [Это работает для меня] (http: // codepad.org/U5XOZL5c), а также OP и другие. – icktoofay
отредактирован/исправлен - у меня все еще есть вырезание и вставка в окне терминала :) –