从零开始的Python计划#7.3类(延伸)

7.1和7.2我们从程序和面向对象的编程开始,更加详细地了解了面向对象设计和面向对象编程的设计规范,现在我们可以继续了解怎么应用Python编程环境中的所有这些通用概念。
可以看到,虽然类的概念有些复杂和困难,好处是真的方便,六行代码就可以创建一个银行账户,还能将用户分配到银行账户并在最后显示所有内容。

Python中的类定义

类定义:一组定义类的方法和数据属性的语句(类似于函数定义,是个相似的概念,但是是不同的语法)

格式:从单词class开始:
在这里插入图片描述
类的名字用首字母大写,方法和其他python函数定义一样。(基本上可以定义类中具有任何其他函数定义的任何方法)


self参数:在类中的每个方法中都是必需的---它引用该方法正在处理的特定对象(每次有新方法时,需要用到self。self是编写函数的方法是指它所存储的对象)
有一个初始化方法:在创建类的实例时自动执行。初始化方法会初始化对象的数据属性,并将self参数分配给刚创建的对象。
格式:
在这里插入图片描述
类方法除了self还有多个参数。


对象状态:给定时刻的对象属性值
方法显示对象状态在这里插入图片描述
我们可以用这个方法对我的对象进行快照并在给定时刻准确地看到属性
当对象作为参数传递给print函数和str函数时会自动调用它 (当我们把一个对象放到print函数时,字符串方法被自动调用,我们可以在控制台看到对象的快照)


实例属性:属于类的特定实例,这个属性是在方法使用self参数创建时创建的。

如果创建了一个类的多个实例,则每个实例都具有自己的一组属性。

类定义(示例)

这是一个非常简单的类的例子,我们有一个银行账户,有一个初始化方法取第一个参数并定义了余额。然后有两种方法:存款和取款
在这里插入图片描述
有一个BankAccount的类,这个银行账户类模拟银行账户,是一个单一的银行账户,init方法接受账户余额的参数。当我们创建一个银行账户实例时,我们给了它存款余额,它被分配给存款余额属性。
def_init_(self,bal): ,我们不只是传递self,还有balance。 self.balance = bal ,此类的初始init方法仅获取一个数字,然后创建该数字并将其分配给balance内部属性。
如我们之前所说,存款方法把存款存入账户。
def deposit_money(self,amount):
self.balance += amouny它把余额加起来,把总数加起来,
return self.balance,因为我存了款,账户的余额会加上我存入的数目
取款则是我取出账户里的一定数量,def withdraw_money(self, amount):
如果余额大于自身,则余额减去金额,如果没有足够的存款,会打印一条错误的信息,然后把余额返还。

----------------------------------------------------------------------

类实例

类可以存储在模块中(类似于我们可以存储函数到模块,然后导入模块并调用内部的所有函数)模块的文件名必须以.py结尾 ; 模块可以导入到使用该类的程序中。

创建类的新实例,可以调用initializer方法: 格式:输入实例的名称,然后分配给它带括号的类名: 在这里插入图片描述
我们可以认为它是我们创建的新数据类型,是一个确切的类去解决复杂的数据


要使用创建的实例调用任何类方法,使用点符号
当在类中有一些方法需要访问,用点符号表示它们:
格式:

在这里插入图片描述
比如之前的银行账户取款是BankAccount.withdraw()
因为自参数引用对象的特定实例,该方法将影响此实例。因为self参数引用 对象的特定实例,调用的方法只影响这个对象的实例而不是每个对象的实例。 对self的引用会自动传递****(比如我已经在我的类定义中写了self,就不需要再写self了)

类实例(示例)

再次举银行账户的例子:
返回我在银行账户中的金额的方法
在这里插入图片描述
定义main,
要求用户输入一个数据类型为浮点数的初始余额,一旦用户输入了起始余额,
我们创造一个bankaccount的实例:bankaccount.BankAccount,
调用实例并使用方法deposit_money来添加200,存下银行账户的钱,
然后打印账户的余额。

访问器和变异器方法

我们还可以使用访问器和变异器作为与实例交互的方法。
对象的数据属性应该是私有的,为了确保这一点,要在属性名前面加下划线。(当我们确定某件事情是隐私的时候,需要放__,它可以确保没有冲突并且属性是私有的。
像我们之前说过的钟对象,这将使属性成为私有属性:在这里插入图片描述
通常所有类的数据属性都是私有的,并提供访问和更改它们的方法。

访问器方法:从类的属性返回一个值而不更改它。它们是类之外的代码检索属性值的安全方法。(我们可以把它想象是在你的笔记本电脑,它给你读的权限,但不给写的权限。就是说有一些方法可以给你一个值,但不让你改变它)

突变器方法:存储或更改数据属性的值

类示例

对于同一个银行账户,这是一个更大的脚本:在这里插入图片描述
定义一个有余额的银行账户,有一个存款和取款的方法,最后得到余额和设置金额。
另一个相似的代码:在这里插入图片描述
请求用户输入,用用户设置的起始余额创建账户,
存了200,
打印账户的余额,然后打印存储在里面的实际金额。

在这里插入图片描述
所以输入余额200,最后余额是400。
但是当我试图在对象实例中打印私有变量时,会得到一个错误,因为银行账户对象没有属性余额(这是私人的)。当我想从外部调用它时,python会觉得因为是私人属性所以不存在。从外面看不到,但里面知道。

贯彻联系

(1)

我们有一个银行账户和一个客户对象,
每个客户都应该连接到自己的银行账户:在这里插入图片描述
关联通常是通过将一个对象作为另一个对象的属性来实现的。(我创建了两个对象,但是用一个对象作为另一个对象的属性)

(2)

在这里插入图片描述
有一个Customer类,它有一个init方法来定义名称和地址,然后有一个方法来设置名称,一个方法来设置地址,一个获取名称的方法,一个获取地址的方法。(这里我们必须改变方法和访问方法,修改内部的数据以访问它,让我仅访问数据)

(3)

在这里插入图片描述
有一个Customer的类,
创建一个BankAccount类,将导入Customer类,
(进入代码可以看到class BankAccount基本上是与之前创建的Customer类的关联。)
init方法接受参数,账户余额,顾客姓名,地址。然后从BankAccount类里调用Customer类,Customer类封装在另一个类里面,
一旦有了amount和self维持着,取款withdraw是自我维持的,
在最后BankAccount类结束时,我们不只能看到所有的银行资料,也可以让用户与客户的详细信息交互。

(4)

在这里插入图片描述
要求用户输入一个起始余额,名称和地址,
有效调用BankAccount类,
在余额中加上200然后打印account。在这里插入图片描述
得到的不仅仅是account,还有所有与账户相关的客户信息。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章