【问题标题】:magic method for passing object in function as argument?将函数中的对象作为参数传递的魔术方法?
【发布时间】:2018-05-02 20:25:43
【问题描述】:

当我将对象作为函数的参数传递时,是否有任何魔术方法会调用?

class Test:
    def __init__(self, a, b):
         self.a = a
         self.b = b
    def __???__(self):
         return (self.a, self.b)

test = Test(0, 1)

some_function(test) # I'd like to pass parameters (0, 1) here

【问题讨论】:

  • 不,没有。那会非常混乱。不过,您可以实现__iter__ 并调用some_function(*test)
  • Python 没有魔法。您可能希望看到 Ruby 的魔法。
  • 另见this answer,由 Python 核心开发人员 Raymond Hettinger 撰写。
  • @ElisByberi 像__len____add____repr__ 这样的方法通常被称为“魔术方法”
  • @PM2Ring 他们当然称它们为魔法。他们用它们来耍花招!我仍然认为“显式胜于隐式”。

标签: python python-3.x arguments


【解决方案1】:

不,函数的参数不会以任何方式进行特殊处理。这只是另一个赋值(对函数的参数名称)。

如果您需要将ab 视为单独的参数,请将Test 设为序列,然后使用*sequence 调用语法将其传入以扩展序列以分隔论据。您可以通过将其设为iterator type 来使其成为一个序列:

class Test:
    def __init__(self, a, b):
         self.a = a
         self.b = b
    def __iter__(self):
         return iter((self.a, self.b))

test = Test(0, 1)
some_function(*test)

演示:

>>> def some_function(a, b):
...     print(f'a = {a!r}\nb = {b!r}')
...
>>> test = Test(0, 1)
>>> some_function(*test)
a = 0
b = 1

【讨论】:

  • PEP 498 f-strings 的好例子。
  • 我的印象是 f-string 必须评估为一个值。两个问题, some_function 是传递 self.a 的值还是实际上传递了指针,然后在 print 语句中查找?如果一个值最终会传递给 f-string,那么在这里使用 !r 有什么好处?
  • @Rookie:是的,f 字符串指定其结果被插值的表达式。 str.format() 等价于 'a = {!r}\nb = {!r}'.format(a, b)ab 只是some_function() 函数中的局部变量。如果这有助于你更好地理解,你可以给它们起不同的名字。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-05
  • 1970-01-01
  • 2014-02-14
  • 2013-09-11
  • 2018-02-23
  • 2012-05-30
  • 1970-01-01
相关资源
最近更新 更多