论坛首页 编程语言技术论坛

python类学习

浏览 9140 次
锁定老帖子 主题:python类学习
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-12-26  

1.魔术方法__init__(相当于php中的__construct)
(1)
>>> class Test:
    def __init__(self):
        self.var=34

        
>>> f=Test()
>>> f.var
34

(2)
>>> class Test:
    def __init__(self,name='4nail'):
        self.name=name

        
>>> f=Test()
>>> f.name
'4nail'
>>> f=Test('this is a init')
>>> f.name
'this is a init'
>>>

2.继承(inherite),B继承A
>>> class A:
    def getClassName(self):
        print 'Hello,I am A'

        
>>> class B(A):
    pass

>>> a=A()
>>> b=B()
>>> a.getClassName()
Hello,I am A
>>> b.getClassName()
Hello,I am A
>>>

3.方法的覆盖
(1)
>>> class B:
    def getClassName(self):
        print 'Hello,I am B'

        
>>> a=A()
>>> b=B()
>>> a.getClassName()
Hello,I am A
>>> b.getClassName()
Hello,I am B
>>>

(2)出错,因为父类构造方法被覆盖了,所以会出错
>>> class Emploee:
    def __init__(self):
        self.name='wang'

        
>>> class Developer(Emploee):
    def __init__(self):
        self.age=23
    def getAge(self):
        print self.age

        
>>> a.name
'wang'
>>> b=Developer()
>>> b.age
23
>>> b.name

Traceback (most recent call last):
  File "<pyshell#96>", line 1, in <module>
    b.name
AttributeError: Developer instance has no attribute 'name'
>>>

(3)
解决(2)方法
>>> class Developer(Emploee):
    def __init__(self):
        Emploee.__init__(self)#调用父类构造方法
        self.age=34
    def getAge(self):
        return self.age

    
>>> a=Emploee()
>>> b=Developer()
>>> a.name
'wang'
>>> b.age
34
>>> b.name
'wang'
>>>

   发表时间: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

可以看到,其实他们指向了同一个对象。
0 请登录后投票
   发表时间: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

可以看到,这样就实现了在不同实例中数据的共享。

但我这个想法是否正确呢?
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics