锁定老帖子 主题:python类学习
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-12-26
1.魔术方法__init__(相当于php中的__construct) 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-01-05
我最近有个问题,就是:
如果在一个类A中,实例化了另一个类B,那么实例化A后的对象都是引用B的实例化吗? #!/usr/bin/env python # -*- coding:utf-8 -*- class myDescirptor(object): def __init__(self,initval=None,name='var'): self.l=[] self.val=initval self.name=name self.count=0 def __get__(self,obj,objtype): if obj not in self.l: self.l.append(obj) self.count=self.count+1 print 'Retrieving',self.name print 'Count',self.count return self.val def __set__(self,obj,val): if obj not in self.l: self.l.append(obj) self.count=self.count+1 print 'Updating',self.name self.val=val 然后呢: In [2]: class myClass(object): ...: x=myDescirptor(10,'x') ...: y=5 ...: ...: In [3]: m=myClass() In [4]: n=myClass() In [5]: m.x Retrieving x Count 1 Retrieving x Count 1 Out[5]: 10 In [6]: n.x Retrieving x Count 2 Retrieving x Count 2 Out[6]: 10 In [7]: m.y Out[7]: 5 In [8]: n.y Out[8]: 5 这里还没什么问题,但下面就不懂了。 我们如果修改y的值,那么这两个实例是不会互相影响的: In [9]: m.y=55 In [10]: n.y Out[10]: 5 这个没什么问题。但对于x,好像就不是这样子了: In [11]: m.x=11 Updating x In [12]: n.x Retrieving x Count 2 Retrieving x Count 2 Out[12]: 11 可以看到,其实他们指向了同一个对象。 |
|
返回顶楼 | |
发表时间:2011-01-05
因此,我就写了下面这个代码:
#!/usr/bin/env python # -*- coding:utf-8 -*- class MyDescriptor(object): def __init__(self): self.count=0 self.l=[] def __get__(self,obj,objtype): if obj not in self.l: self.l.append(obj) self.count=self.count+1 return self.count def __set__(self,obj,objtype): raise AttributeError, "unreadable attribute" class testDescriptor(object): count=MyDescriptor() def __init__(self): print("count:%03d"%self.count) self.ct=self.count print("Object %03d constructed"%self.ct) def __del__(self): print("Object %03d destroyed"%self.ct) 然后我们就可以去调用了: In [2]: a=testDescriptor() count:001 In [3]: a=testDescriptor() count:002 In [4]: a=testDescriptor() count:003 In [5]: b=testDescriptor() count:004 可以看到,这样就实现了在不同实例中数据的共享。 但我这个想法是否正确呢? |
|
返回顶楼 | |
浏览 9140 次