您的位置:首页 > 编程语言 > Python开发

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Python