Python小贴士之类
2013-09-21 18:21
141 查看
本博客已迁往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
相关文章推荐
- python3入门之类
- Python学习之类
- Python初学之类的方法
- 【python】class之类属性
- Python之类的重写和私有变量
- 菜鸟学python之类和对象
- Python学习教程(七)——抽象之类和对象
- python类、对象、方法、属性之类与对象
- python面相对象之类和对象
- Python初学之类的继承和多态
- python基础之类的特性(property)
- python之类之select
- python进阶之类常用魔法方法和魔法属性
- PYTHON之类和对象
- Python初学之类的狭义属性(@property)
- python之类定义
- python基础之类的进阶
- Python小贴士之赋值语句、分支语句和循环语句
- Python基础(面向对象之类成员与修饰符)
- python之类--socket