【问题标题】:How do you set the (attribute, value) in globals() to be that of a method (name, value)?您如何将 globals() 中的(属性,值)设置为方法(名称,值)?
【发布时间】:2018-12-26 23:31:20
【问题描述】:

在 JS 中,您可以执行类似的操作,将对象/dict、obj 的所有键、值分配到全局命名空间/上下文 obj 中并使用 this[key] = obj[key]

我希望能够做到这一点

class A:
    def call(self):
        print('a')

a = A()

globals()['call'] = lambda: None
print(globals())
setattr(globals(), 'call', a.call)

令人困惑的是,我得到的错误是 AttributeError: 'dict' object has no attribute 'call' ,即使我在打印 globals() 时明确定义了调用

【问题讨论】:

  • 属性和键在 Python 中不是一回事。
  • 你为什么还要乱用globals dict呢?为什么不call = a.call???
  • @juanpa.arrivillaga 用于当我决定将 7 个以上的函数移动到一个类时,但我懒得重构,我可能会在开发这个时将更多的函数移入或移出这个类脚本;是的,这是糟糕的设计,我的 IDE 会认为我正在尝试使用一些不是 def 的 var

标签: python setattribute global


【解决方案1】:
class A:
    def call(self):
        print('a')

    def call2(self):
        print('b')

a = A()

method_names = list(filter(lambda func: '__' not in func, dir(a)))
for func in method_names:
    globals()[func] = getattr(a, func)

# globals()['call'] = a.call
print(globals())
call()
call2()
# setattr(globals(), 'call', a.call)

哎呀,属性和键在 JS 中是相同的东西时混淆了。谢谢

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-02
    • 2012-03-13
    • 1970-01-01
    • 2014-12-18
    • 1970-01-01
    相关资源
    最近更新 更多