4.2 类与对象
下面我们正式创建自己的类,这里我们使用Python自定义精灵宝可梦中的小火龙,如代码清单4-1所示。
代码清单4-1 自定义类1
class Charmander: def setName(self,name): self.name = name def getName(self): return self.name def getInfo(self): return self
*代码详见:示例程序/code/4-2.py
类的定义就像函数定义,用class语句替代了def语句,同样需要执行class的整段代码这个类才会生效。进入类定义部分后,会创建出一个新的局部作用域,后面定义的类的数据属性和方法都是属于此作用域的局部变量。上面创建的类很简单,只有一些简单的方法。当捕捉到精灵的时候,首先要为其起名字,所以我们先编写函数setName()和getName()。似乎函数中self参数有点奇怪,我们尝试建立具体的对象来探究该参数的作用。
>>>pokemon1 = Charmander() >>>pokemon2 = Charmander() >>>pokemon1.setName('Bang') >>>pokemon2.setName('Loop') >>>print pokemon1.getName() Bang >>>print pokemon2.getName() Loop >>> print pokemon1.getInfo() <__main__.Charmander instance at 0x02F26B98> >>> print pokemon2.getInfo() <__main__.Charmander instance at 0x02F26AF8>
创建对象和调用一个函数很相似,使用类名作为关键字创建一个类的对象。实际上Charmander的括号里是可以有参数的,后面我们会讨论到。我们捕捉了两只精灵,一只名字为Bang,另一只为Loop,并且对它们执行getName(),名字正确返回。观察getInfo()的输出,返回的是包含地址的具体对象的信息,可以看到两个对象的地址是不一样的。self的作用与C++的*this指针类似,在调用Charmander的setName和getName函数时,函数都会自动把该对象的地址作为第一个参数传入(该信息包含在参数self中),这就是为什么我们调用函数时不需要写self,而在函数定义时需要把self作为第一个参数。传入对象的地址是相当必要的,如果不传入地址,程序就不知道要访问类的哪一个对象。
类的每个对象都会有各自的数据属性。Charmander类中有数据属性name,这是通过setName()函数中的语句self.name=name创建的。这个语句中的两个name是不一样的,它们的作用域不一样。第一个name通过self语句声明的作用域是类Charmander()的作用域,将其作为pokenmon1的数据属性进行存储,而后面的name的作用域是函数的局部作用域,与参数中的name相同。而后面getName()函数返回的是对象中的name。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论