返回介绍

4.2 类与对象

发布于 2024-01-21 22:13:25 字数 1519 浏览 0 评论 0 收藏 0

下面我们正式创建自己的类,这里我们使用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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文