【问题标题】:Is it possible to import a function as a class method?是否可以将函数作为类方法导入?
【发布时间】:2016-06-14 20:51:32
【问题描述】:

我想知道这是否可能。

假设有两个文件。

在 a.py 中:

class A()

在 b.py 中:

def x():  
def y():

我想将 b.py 中的函数 x() 导入到 a.py 的 A 类中,这样 A 类就有一个方法 x。

这样我就可以这样使用了

test = A()
test.x()

谢谢!

【问题讨论】:

  • 没有那个签名。
  • import b ; class A(): x = staticmethod(b.x) 这样吗?
  • 似乎是 XY 问题。你到底想完成什么?
  • 你可以在 b.py 中创建一个类并继承
  • 您是否有可能尝试为列表子类导入random.shuffle?我在answer here 中描述了为什么该特定情况不起作用

标签: python


【解决方案1】:

如果函数签名不允许将A 的实例作为第一个参数传递,那么您可以做的最好的事情就是将它们设为staticmethods:

import b
class A:
    x = staticmethod(b.x)
    y = staticmethod(b.y)

test = A()
test.x()

但是,如果您有可以将 A 实例作为第一个参数的函数,那么它就是:

class A:
    from b import x,y

test = A()
test.x()

【讨论】:

    【解决方案2】:

    为什么不试试呢?

    a.py

    class A():
        from b import x, y
    
    a = A()
    a.x()
    

    b.py

    def x():
        print "Hi, I'm x!"
    
    
    def y():
        print "Hi, I'm y!"
    

    哎呀,那没用!

    Traceback (most recent call last):
      File "a.py", line 6, in <module>
        a.x()
    TypeError: x() takes no arguments (1 given)
    

    但这很容易解决,方法期望将类实例传递给它们!让我们修改 b.py...

    b.py,已修改

    def x(self):
        print "Hi, I'm x!"
    
    
    def y(self):
        print "Hi, I'm y!"
    

    执行此操作将打印:

    嗨,我是 x!

    请记住在发布之前先尝试一下 - 答案通常很简单,例如“是的,就这样做!” :)

    【讨论】:

    • 您可能想澄清“类方法需要一个类实例”,因为classmethod 是与这种情况无关的真实事物,也许只是说“方法需要一个类的实例” (除此之外;非常好的答案!)
    猜你喜欢
    • 1970-01-01
    • 2017-08-18
    • 1970-01-01
    • 2021-07-19
    • 2012-08-15
    • 1970-01-01
    • 2019-07-12
    • 2013-01-16
    相关资源
    最近更新 更多