Python 有没有表示对象分配的方法?
我一直在研究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
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指令(