再谈类定义
2018-08-25 本文已影响0人
cloveses
上文中定义了一个包含一个构造方法和四个实例属性的类MyLine。对于Python中的类,还有其他相关的概念需要我们了解。
Python中实例属性包含实例变量和实例方法。
1.实例变量的定义
作为动态语言,Python中的类不要求预先定义实例变量,实例变量赋值即视为定义,你也可以在类的其他普通方法中定义和使用实例变量。请看如下交互式环境下运行的代码:
>>> class Foo:
def__init__(self,x):
self.x= x
deftesta(self,y):
self.y= y
defgetxy(self):
print(self.x,self.y)
>>> f = Foo(3)
>>> f.getxy()
Traceback (most recent call last):
File"", line 1, in
f.getxy()
File"", line 9, in getxy
print(self.x,self.y)
AttributeError: 'Foo' object has noattribute 'y'
>>> f.testa(9)
>>> f.getxy()
3 9
第一次调用f.getxy()时,试图使用实例变量y,Python给出的错误信息很明确,此时,Foo对象的实例f还不具有实例变量y。当执行完f.testa(9)时,实际上就是运行了方法中的语句self.y = 9,这时,通过赋值即定义的形式使f这个实例具有了y这个实例变量。所以,再次调用f.getxy()时,成功地输出了x和y的属性值。
一般情况下,实例变量尽量在类的构造方法中定义和赋值,如果能保证其实例变量是在使用前被定义和赋值,则也可以在一般方法中定义实例变量,实现的方法可以是在构造方法中调用定义实例变量的一般方法一次。
2.实例方法的定义
通过上文中的代码,也可以看出一般实例方法的定义和构造方法定义形式是类似的,只不过方法名称不使用双下划线了。
一般方法的定义时,第一个参数也是self,用于对实例自身的引用,其他参数可以和面向过程的函数一样,由用户根据实际需求定义。但需要说明的是,在使用类实例去调用普通的实例方法时,self这个参数是不用提供的,由Python自动传入。