Python面向对象类编写细节分析【类面向对象类编写细节分析【类,方法方法,继承继承,超类超类,接口等】接口等】
本文实例讲述了Python面向对象类编写技术细节。分享给大家供大家参考,具体如下:
类代码编写细节类代码编写细节
继续学习类、方法和继承。
class语句语句
以下是class语句的一般形式:
class <name>(superclass,...):
data = value
def method(self,...):
self.member = value
在class语句内,任何赋值语句都会产生类属性,而且还有特殊名称方法重载运算符。例如,名为__init__的函数会在实例对象
构造时调用(如果定义过的话)。
例子例子
类是命名空间,也就是定义变量名(属性)的工具。
1.就像函数一样,class语句是本地作用域,由内嵌的赋值语句建立的变量名,就存在于这个本地作用域内。
2.就像模块内的变量名,在class语句内赋值的变量名会变成类对象中的属性。
因为class是复合语句,所以任何种类的语句都可位于其主体内:print、=、if、def等。当class语句自身执行时,class语句内
的所有语句都会执行。在class语句内赋值的变量名,会创建类属性,而内嵌的def则会创建类方法。
例如,把简单的非函数的对象赋值给类属性,就会产生数据属性,由所有实例共享。
>>> class ShareData:
spam = 42
>>> x = ShareData()
>>> y = ShareData()
>>> x.spam,y.spam
(42, 42)
在这里,因为变量名spam是在class语句的顶层进行赋值的,因此会附加在这个类中,从而为所有的实例共享。我们可通过类
名称修改它,或者是通过实例或类引用它。
>>> ShareData.spam = 99
>>> x.spam,y.spam,ShareData.spam
(99, 99, 99)
这种类属性可以用于管理贯穿所有实例的信息。例如,所产生的实例的数目的计数器。
现在,如果通过实例而不是类来给变量名spam赋值时,看看会发生什么:
>>> x.spam = 88
>>> x.spam,y.spam,ShareData.spam
(88, 99, 99)
对实例的属性进行赋值运算会在该实例内创建或修改变量名,而不是在共享的类中。
对对象属性进行赋值总是会修改该对象,除此之外没有其他的影响。例如,y.spam会通过继承而在类中查找,但是,
对x.spam进行赋值运算则会把该变量名附加在x本身上。
看下面这个例子,可以更容易理解这种行为,把相同的变量名储存在两个位置:
>>> class MixedNames:
data = 'spam'
def __init__(self,value):
self.data = value
def display(self):
print(self.data,MixedNames.data)
当创建这个类的实例的时候,变量名data会在构造函数方法内对self.data进行赋值运算,从而把data附加到这些实例上。