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( )) 展开
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( )) 展开
1个回答
展开全部
代码看起来没有问题。如果在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这书里的)
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询