Python小贴士之类

来源:互联网 发布:上海淘宝美工学校 编辑:程序博客网 时间:2024/06/06 13:58

当定义一个类时,如果这个类没有任何父类,则将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):    passclass C2(P1, P2):    def bar(self):        print 'called C2-bar()'class GC(C1, C2):    passgc = GC()gc.foo()gc.bar()
执行结果如下:
called P1-foo()called C2-bar()
将类P1和P2的父类object去掉则变成了经典类,重新执行后的结果如下:
called P1-foo()called P2-bar()


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

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

class C(object):    version = 1c = C()print C.version, c.versionC.version = 2print C.version, c.versionc.version = 3print 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 = phclass 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.__namec = C('a')c.showName()print c._C__name

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

原创粉丝点击