Любой метод для обозначения назначения объекта?

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

a = MyClass(*params).method() 

против:

 MyClass(*params).method() 

В том смысле, что, возможно, я могу захотеть вернуть список, который был разделен на символ '\n' , или сбросить необработанный список в переменную a которая сохраняет '\n' неповрежденной.

Есть ли способ спросить Python, если его следующее действие вот-вот вернет значение переменной и изменит действие, если это так? Я думал:

 class MyClass(object): def __init__(params): self.end = self.method(*params) def __asgn__(self): return self.method(*params).split('\n') def __str__(self): """this is the fallback if __asgn__ is not called""" return self.method(*params) 

2 Solutions collect form web for “Любой метод для обозначения назначения объекта?”

Нет. Вы не можете изменить то, что происходит, когда вы назначаете голое имя.

Вы можете изменить, что произойдет, если цель назначения в левой части является атрибутом или элементом объекта. Вы можете переопределить a[blah] = ... с __setitem__ и a.blah = ... с __setattr__ (хотя вы можете подключаться к ним только на a , а не на назначаемом объекте). Но вы не можете переопределить или каким-либо образом повлиять на a = ...

Обратите внимание, что изменение правой руки в зависимости от того, что произойдет, будет еще более странным и очень плохим. Это означало бы, что

 someFunc(MyClass().method()) 

может отличаться от

 a = MyClass().method() someFunc(a) 

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

Не должно быть разницы между непосредственным вызовом MyClass(*params).method() и присвоением переменной. То, что вы видите здесь, – это ваш переводчик, автоматически печатающий результаты возврата, поэтому он, кажется, разбит, а значение переменной содержит маркеры EOL.

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

 class Assigner(object): def __init__(self, assignment_callback): self.assignment = assignment_callback def __setattr__(self, key, value): if hasattr(self, 'assignment'): value = self.assignment(value) super(Assigner, self).__setattr__( key, value ) def uppercase(value): # example function to perform on each attribute assignment return value.upper() 

Затем в вашем коде вместо присвоения переменной напрямую вы назначаете атрибуты на свой объект:

 >>> my = Assigner(uppercase) >>> my.a = 'foo' >>> print my.a FOO 
  • Объем имен, определенных в блоке классов, не распространяется на блоки методов. Почему это?
  • Должен ли я использовать класс? (Python)
  • python: абстрактный базовый класс '__init __ (): инициализация или проверка?
  • Различия между isinstance () и type () в python
  • Python: получение значений базового класса из производного класса
  • Python 3: Обмен переменными между методами в классе
  • Когда лучше всего использовать класс в Python?
  • Печать всех свойств класса Python
  • Python - лучший язык программирования в мире.