Python 中的 Javascript 风格对象方法?
在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 个回答
在编程中,有时候我们会遇到一些问题,比如代码运行不正常或者出现错误。这种情况下,我们需要去查找原因,看看哪里出了问题。通常,我们可以通过查看错误信息来帮助我们找到问题所在。
错误信息就像是程序给我们的提示,它告诉我们哪里出错了,可能是什么原因导致的。理解这些信息可以帮助我们更快地解决问题。
另外,有时候我们也可以在网上找到其他人遇到类似问题的解决方案,比如在StackOverflow这样的论坛上。这里有很多程序员分享他们的经验和解决方法,我们可以从中学习到很多东西。
总之,遇到问题时,不要慌张,仔细查看错误信息,利用网络资源,通常都能找到解决办法。
def test():
print "hello"
testDict = {"name" : "Joe", "age" : 35, "speak" : test}
testDict["speak"]()
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__
,这个我就留给你自己去练习了。
person = {
'name': 'Joe',
'age': '35',
'speak': lambda: 'o hai i am joe',
}
person['speak']()
不过,在Python中(和JavaScript不一样),访问属性和使用方括号([])的方式是不同的。要执行speak这个功能,你需要这样写: