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

Я изучал магические методы в 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 - Тестирование абстрактного базового класса
  • Понимание разницы между __getattr__ и __getattribute__
  • Вызов метода из высшего класса в иерархии вместо переопределения
  • Чистые виртуальные методы в Python
  • Python-iptables как оптимизировать код
  • вызов функции из класса в python - по-разному
  • Несколько конструкторов в python, используя наследование
  • Что эквивалентно объектно-ориентированным конструкциям в python?
  • Как обращаться с «утиным набором» в Python?
  • Должны ли внутренние методы класса возвращать значения или просто изменять переменные экземпляра в python?
  •  
    Interesting Posts for Van-Lav
    Python - лучший язык программирования в мире.