Python 中的 Javascript 风格对象方法?

2 投票
4 回答
1026 浏览
提问于 2025-04-16 22:23

在JavaScript中,我可以这样做:

var person = {
  name: 'Joe',
  age:  '35',
  speak: function(){
    return 'o hai i am joe'
  }
}

然后我可以调用那个方法:

person.speak()
'o hai i am joe'

我知道在Python中可以用类来做到这一点,可能这才是正确的做法。

不过,我很好奇——有没有办法把一个函数作为值放进Python的字典里呢?

4 个回答

2

在编程中,有时候我们会遇到一些问题,比如代码运行不正常或者出现错误。这种情况下,我们需要去查找原因,看看哪里出了问题。通常,我们可以通过查看错误信息来帮助我们找到问题所在。

错误信息就像是程序给我们的提示,它告诉我们哪里出错了,可能是什么原因导致的。理解这些信息可以帮助我们更快地解决问题。

另外,有时候我们也可以在网上找到其他人遇到类似问题的解决方案,比如在StackOverflow这样的论坛上。这里有很多程序员分享他们的经验和解决方法,我们可以从中学习到很多东西。

总之,遇到问题时,不要慌张,仔细查看错误信息,利用网络资源,通常都能找到解决办法。

def test():
    print "hello"

testDict = {"name" : "Joe", "age" : 35, "speak" : test}

testDict["speak"]()
3

JavaScript和Python之间一个重要的区别是它们在方法命名空间中如何处理目标对象。在JavaScript中,this是在方法被调用时根据需要设置的,而在Python中,self的确定则是结合了类创建的时间(将函数变成实例方法)和访问属性的时间(将im_self属性绑定到实例方法上)。即使你只使用属性访问,当你想把实例方法绑定到单个实例而不是类时,克服这个差异会有点棘手。

import functools
class JSObject(object):
    def __getattribute__(self, attr):
        """
        if the attribute is on the instance, and the target of that is
        callable, bind it to self, otherwise defer to the default getattr.
        """
        self_dict = object.__getattribute__(self, '__dict__')
        if attr in self_dict and callable(self_dict[attr]):
            return functools.partial(self_dict[attr], self)
        else:
            return object.__getattribute__(self, attr)

下面是实际操作的例子:

>>> foo = JSObject()
>>> foo.bar = 'baz'
>>> foo.bar
'baz'
>>> foo.quux = lambda self: self.bar
>>> foo.quux
<functools.partial object at 0x7f8bae264ba8>
>>> foo.quux()
'baz'

让上面的类更像dict是另一个问题,在我看来,这并不是JavaScript中最好模仿的“特性”,但假设我们想要这样做,我们可能会从子类化dict开始,然后再次重载__getattr____getattribute__,这个我就留给你自己去练习了。

5
person = {
  'name': 'Joe',
  'age':  '35',
  'speak': lambda: 'o hai i am joe',
}
person['speak']()

不过,在Python中(和JavaScript不一样),访问属性和使用方括号([])的方式是不同的。要执行speak这个功能,你需要这样写:

撰写回答