python中,如何在初始化实例时,动态为其添加属性

就像下面代码描述的,但这代码在3.x中行不通了,self.s中的s怎么能变为被传入的参数下面是段2.x的代码,classSingleton(object):"""APyt... 就像下面代码描述的,但这代码在3.x中行不通了,

self.s中的s怎么能变为被传入的参数

下面是段2.x的代码 ,
class Singleton(object):
""" A Pythonic Singleton """
def __new__(cls, *args, **kwargs):
if '_inst' not in vars(cls):
cls._inst = object.__new__(cls)
return cls._inst

if __name__ == '__main__':
class SingleSpam(Singleton):
def __init__(self, s): self.s = s
def __str__(self): return self.s
s1 = SingleSpam('spam')
print(id(s1), s1.spam( ))
s2 = SingleSpam('eggs')
print(id(s2), s2.spam( ))
展开
 我来答
bdwisyou7d
2014-07-02 · TA获得超过1.3万个赞
知道大有可为答主
回答量:3774
采纳率:81%
帮助的人:1062万
展开全部

代码看起来没有问题。如果在python3上不能用,应该也只需要小小的调整。原则上应该跑得通。

不过话说回来,这样的技巧通常在python里用不上。因为python的强大并不是因为它的面向对象属性。

而且这些写代码的可读性也较差。 python的强大在于它通用,它与C的良好结合,最重要的是它是“脚本”。 可以动态的做任何事情,既然它的动态很强大,你就不需要写这样的代码。


直接这样

s1= AnyClass()

s1.any_variable = some_value

这样足够了。因为python可以自动给未知的变量,增加一个内部属性。所以我经常写下面的这样的代码

class Config:
    pass
conf = Config()
conf.mysql_ip = "127.0.0.1"

这样就可以了

追问
这python2.x中
class SingleSpam(Singleton):
def __init__(self, s):
self.s = s
s1 = SingleSpam('spam')

就会变成self.spam = 'spam'的么
所以s1.spam ='spam' 不可思议啊
(代码是在python cookbook这书里的)
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式