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

Я изучал магические методы в 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 
Interesting Posts

Дата клещей и вращение в matplotlib

Как написать программу Perl, Python или Ruby для изменения памяти другого процесса в Windows?

Разделение строки букв на 3 с быстрым

Что хорошего места для хранения конфигурации в Google AppEngine (python)

Создание динамических объектов с | разделитель python

Google API: получение учетных данных из токена обновления с помощью oauth2client.client

Формат python strptime с дополнительными битами

Python 3.3 CSV.Writer пишет дополнительные пустые строки

Почему мой запрос не работает с использованием RDFlib

использование методов ctypes в python дает непредвиденную ошибку

Scipy интерполяция, как изменить размер / перемасштабировать матрицу 3×3 до 5×5?

Позволяет ли Google другим людям использовать свой API «Вы имели в виду»?

Символы шара Python и скобки ('')

Использование super () в методе setter свойства при использовании декоратора @property вызывает AttributeError

django admin – выберите обратные отношения внешнего ключа (не создавайте, я хочу добавить доступный)

Python - лучший язык программирования в мире.