Python 有没有表示对象分配的方法?

Python 有没有表示对象分配的方法?,python,oop,magic-methods,Python,Oop,Magic Methods,我一直在研究Python中的魔法方法,并一直在想是否有一种方法可以概述以下的具体操作: a = MyClass(*params).method() 与: MyClass(*params).method() 从某种意义上说,我可能希望返回一个已在'\n'字符上拆分的列表,而不是将原始列表转储到保持'\n'完整的变量a 有没有一种方法可以询问Python的下一个操作是否将要向变量返回一个值,如果是这样的话,是否可以更改操作?我在想: class MyClass(object): def

我一直在研究Python中的魔法方法,并一直在想是否有一种方法可以概述以下的具体操作:

a = MyClass(*params).method()
与:

MyClass(*params).method()
从某种意义上说,我可能希望返回一个已在
'\n'
字符上拆分的列表,而不是将原始列表转储到保持
'\n'
完整的变量
a

有没有一种方法可以询问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)

不可以。您无法更改分配给裸名称时发生的情况

如果左侧的分配目标是对象的属性或项,则可以更改发生的情况。您可以使用
\uuuu setitem\uuuuu
覆盖
a[blah]=…
,使用
\uuuu setattr\uuuuu
覆盖
a.blah=…
(尽管您只能在
a
上挂钩,而不能在被分配的对象上挂钩)。但您不能覆盖或以任何方式影响
a=…

请注意,根据“将要发生的事情”进行右侧更改将更加奇怪,而且非常糟糕。那就意味着

someFunc(MyClass().method())
可能不同于

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

在Python中,名称只是附加到对象的标签。对象不知道附加了哪些标签,这是一件好事。您可以将计算结果分配给中间变量,只是为了使后续行更可读,并且您不希望该分配更改该计算的结果。

否。您无法更改分配给裸名称时发生的情况

如果左侧的分配目标是对象的属性或项,则可以更改发生的情况。您可以使用
\uuuu setitem\uuuuu
覆盖
a[blah]=…
,使用
\uuuu setattr\uuuuu
覆盖
a.blah=…
(尽管您只能在
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
直接调用
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允许检查它自己的堆栈,可以使用它查看下一条指令

#/usr/bin/env蟒蛇3
进口dis
进口检验
从itertools导入dropwhile
类MyClass(对象):
def方法(自我):
#检查堆栈以获取调用代码行
frame=inspect.stack()[1]。frame
#拆卸堆叠框架
ins=dis.get_指令(帧f_代码)
#移到最后一条指令
ins=dropwhile(λx:x.offset
这将导致以下行为:

a=MyClass().method()
印刷品(a)
#返回任务
def someFunc(x):
返回x.split()
b=someFunc(MyClass().method())
印刷品(b)
#['returning','to','function/method','call']
MyClass().method()
#丢弃的返回值(如果作为程序调用)
#返回交互式控制台(如果以交互方式运行)

*尽管公认的答案指出,这样做“非常糟糕”。它也是脆弱的,因为它会受到字节码优化的影响。另请参见:

Yes.*Python允许检查自己的堆栈,可以使用它查看下一条指令

#/usr/bin/env蟒蛇3
进口dis
进口检验
从itertools导入dropwhile
类MyClass(对象):
def方法(自我):
#检查堆栈以获取调用代码行
frame=inspect.stack()[1]。frame
#拆卸堆叠框架
ins=dis.get\U指令(