Python小贴士之类

本博客已迁往http://coredumper.cn


当定义一个类时,如果这个类没有任何父类,则将object设置为它的父类,用这种方式定义的类属于新式类。如果定义的类没有设置任何父类,则这种方式定义的类属于经典类。建议使用新式类,新式类将类与内建类型进行了统一。

新式类与经典类在多重继承问题中有一个重要的区别:对于经典类,继承顺序是采用深度优先的搜素算法,对于新式类,继承顺序是采用广度优先的搜素算法。考虑如下新式类的实例:

class P1(object):
    def foo(self):
        print 'called P1-foo()'

class P2(object):
    def foo(self):
        print 'called P2-foo()'
    def bar(self):
        print 'called P2-bar()'

class C1(P1, P2):
    pass

class C2(P1, P2):
    def bar(self):
        print 'called C2-bar()'

class GC(C1, C2):
    pass

gc = GC()
gc.foo()
gc.bar()
执行结果如下:
called P1-foo()
called C2-bar()
将类P1和P2的父类object去掉则变成了经典类,重新执行后的结果如下:
called P1-foo()
called P2-bar()


类具有数据属性和方法属性。

类的数据属性与它所属的类对象绑定,不依赖于任何实例对象,既可以通过类对象访问,也可以通过实例对象访问,这里要注意不能通过实例对象对类的数据属性进行修改。考虑如下实例:

class C(object):
    version = 1

c = C()
print C.version, c.version
C.version = 2
print C.version, c.version
c.version = 3
print C.version, c.version
执行结果:
1 1 2 2 2 3
可以看到当给c.version赋值3时,C.version并没有随之改变,这是因为给c.version赋值之后,创建了一个新的实例属性version,这个实例属性隐藏了同名的类属性。因此,应该避免通过实例对象来访问类属性。

而类的方法属性只能通过实例对象调用,不能通过类对象调用,这也是类中所有方法的第一个参数必须是self的原因,它表示调用此方法的实例对象,当通过实例调用类方法时,不需要给self传入参数,Python会自动把这个实例作为参数传给self。注意,有种特殊情况是,当在子类中重载父类的某个方法时,经常会用父类对象调用父类方法来重用代码,例如:

class FatherClass(object):
    def __init__(self, nm, ph):
        self.name = nm
        self.phone = ph

class SonClass(FatherClass):
    def __init__(self, nm, ph, em):
        FatherClass.__init__(self, nm, ph)
        self.email = em
注意当用类对象调用类方法时,必须传递self参数,因为此时还没有一个实例与该方法绑定,自然就没有办法自动传递这个实例参数了。



类的实例可以具有自己的数据属性,这种属性只与该实例相关,与该实例的类及其他实例无关。由于__init__()是创建实例后第一个被默认调用的方法,所以这里是最早可以设置实例属性的地方。



类的属性以及实例的属性可以通过在变量名前加“__”来实现私有化,例如在类C中定义为self.__name的属性,在类C之外需要用self._C__name进行访问,但是不建议这样做,否则就失去了私有化的意义。考虑如下实例:

class C(object):
    def __init__(self, nm):
        self.__name = nm
    def showName(self):
        print self.__name

c = C('a')
c.showName()
print c._C__name

执行结果如下:
a
a
但是如果执行如下语句就会出错:
print c.__name

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值