Python3简明教程(十一)—— 类
本节中将通过定义一些简单的 Python 类,来学习 Python 面向对象编程的基本概念。
定义类
在写你的第一个类之前,你应该知道它的语法。我们以下面这种方式定义类:
class nameoftheclass(parent_class):
statement1
statement2
statement3
在类的声明中你可以写任何 Python 语句,包括定义变量(在类中称为属性)、定义函数(在类中我们称为方法)。
>>> class MyClass(object):
... """A simple example class"""
... i = 12345
... def f(self):
... return 'hello world'
__init__方法
类的实例化使用函数符号。只要将类对象看作是一个返回新的类实例的无参数函数即可。例如(假设沿用前面的类):
x = MyClass()
以上创建了一个新的类实例并将该对象赋给局部变量 x。
这个实例化操作创建一个空的对象。很多类都倾向于将对象创建为有初始状态的。因此类可能会定义一个名为 __init__() 的特殊方法,像下面这样:
def __init__(self):
self.data = []
类定义了 __init__() 方法的话,类的实例化操作会自动为新创建的类实例调用 __init__() 方法。所以在下例中,可以这样创建一个新的实例:
x = MyClass()
当然,出于弹性的需要,__init__() 方法可以有参数。事实上,参数通过__init__() 传递到类的实例化操作上。例如:
>>> class Complex:
... def __init__(self, realpart, imagpart):
... self.r = realpart
... self.i = imagpart
...
>>> x = Complex(3.0, -4.5)
>>> x.r, x.i
(3.0, -4.5)
继承
当一个类继承另一个类时,它将继承父类的所有功能(如变量和方法)。这有助于重用代码。
在下一个例子中我们首先创建一个叫做 Person 的类,然后创建两个派生类 Student 和 Teacher。当两个类都从 Person 类继承时,它们的类除了会有 Person 类的所有方法还会有自身用途的新方法和新变量。
代码写入文件 /home/shiyanlou/student_teacher.py:
#!/usr/bin/env python3 class Person(object):
"""
返回具有给定名称的 Person 对象
""" def __init__(self, name):
self.name = name def get_details(self):
"""
返回包含人名的字符串
"""
return self.name class Student(Person):
"""
返回 Student 对象,采用 name, branch, year 3 个参数
""" def __init__(self, name, branch, year):
Person.__init__(self, name)
self.branch = branch
self.year = year def get_details(self):
"""
返回包含学生具体信息的字符串
"""
return "{} studies {} and is in {} year.".format(self.name, self.branch, self.year) class Teacher(Person):
"""
返回 Teacher 对象,采用字符串列表作为参数
"""
def __init__(self, name, papers):
Person.__init__(self, name)
self.papers = papers def get_details(self):
return "{} teaches {}".format(self.name, ','.join(self.papers)) person1 = Person('Sachin')
student1 = Student('Kushal', 'CSE', 2005)
teacher1 = Teacher('Prashad', ['C', 'C++']) print(person1.get_details())
print(student1.get_details())
print(teacher1.get_details())
运行程序:
shiyanlou:~/ $ ./student_teacher.py[17:34:31]
Sachin
Kushal studies CSE and is in 2005 year.
Prashad teaches c,c++.
在这个例子中你能看到我们是怎样在 Student 类和 Teacher 类中调用 Person 类的 __init__ 方法。
我们也在 Student 类和 Teacher 类中重写了 Person 类的 get_details() 方法。因此,当我们调用 student1 和 teacher1 的 get_details() 方法时,使用的是各自类(Student 和 Teacher)中定义的方法。
多继承
一个类可以继承自多个类,具有父类的所有变量和方法,语法如下:
class MyClass(Parentclass1, Parentclass2,...):
def __init__(self):
Parentclass1.__init__(self)
Parentclass2.__init__(self)
...
...
删除对象
现在我们已经知道怎样创建对象,现在我们来看看怎样删除一个对象。我们使用关键字 del 来做到这个。
>>> s = "I love you"
>>> del s
>>> s
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 's' is not defined
del 实际上使对象的引用计数减少一,当对象的引用计数变成零的时候,垃圾回收器会删除这个对象。
属性(sttributes)读取方法
在 Python 里请不要使用属性(attributes)读取方法(getters和 setters)。如果你之前学过其它语言(比如 Java),你可能会想要在你的类里面定义属性读取方法。请不要这样做,直接使用属性就可以了,就像下面这样:
>>> class Student(object):
... def __init__(self, name):
... self.name = name
...
>>> std = Student("Kushal Das")
>>> print(std.name)
Kushal Das
>>> std.name = "Python"
>>> print(std.name)
Python
装饰器
你可能想要更精确的调整控制属性访问权限,你可以使用 @property 装饰器,@property 装饰器就是负责把一个方法变成属性调用的。
下面有个银行账号的例子,我们要确保没人能设置金额为负,并且有个只读属性 cny 返回换算人民币后的金额。
代码写入文件 /home/shiyanlou/property.py
#!/usr/bin/env python3 class Account(object):
"""账号类,
amount 是美元金额.
"""
def __init__(self, rate):
self.__amt = 0
self.rate = rate @property
def amount(self):
"""账号余额(美元)"""
return self.__amt @property
def cny(self):
"""账号余额(人民币)"""
return self.__amt * self.rate @amount.setter
def amount(self, value):
if value < 0:
print("Sorry, no negative amount in the account.")
return
self.__amt = value if __name__ == '__main__':
acc = Account(rate=6.6) # 基于课程编写时的汇率
acc.amount = 20
print("Dollar amount:", acc.amount)
print("In CNY:", acc.cny)
acc.amount = -100
print("Dollar amount:", acc.amount)
运行程序:
shiyanlou:~/ $ ./property.py
Dollar amount: 20
In CNY: 132.0
Sorry, no negative amount in the account.
Dollar amount: 20
总结
本实验我们了解了类的定义,类的继承以及多继承,并且最后我们还接触了装饰器这个概念,本质上,装饰器也是一种高阶函数。
参考链接:https://www.shiyanlou.com/courses/596
Python3简明教程(十一)—— 类的更多相关文章
- Python3 简明教程
Python是由吉多·范罗苏姆(Guido Van Rossum)在90年代早期设计.它是如今最常用的编程 语言之一.它的语法简洁且优美,几乎就是可执行的伪代码. 注意:这篇教程是特别为Python3 ...
- Python3 简明教程学习(上)
一.开始 Python 之旅交互模式 1.Ctrl + D 输入一个 EOF 字符来退出解释器,也可以键入 exit() 来退出 2.#!/usr/bin/env python3 中#!称为 Sheb ...
- Python3简明教程(十四)—— Collections模块
collections 是 Python 内建的一个集合模块,提供了许多有用的集合类. 在这个实验我们会学习 Collections 模块.这个模块实现了一些很好的数据结构,它们能帮助你解决各种实际问 ...
- Python3简明教程(十二)—— 模块
在这节我们将要学习 Python 模块相关知识.包括模块的概念和导入方法,包的概念和使用,第三方模块的介绍,命令行参数的使用等. 模块 到目前为止,我们在 Python 解释器中写的所有代码都在我们退 ...
- Python3简明教程(十)—— 异常
在本节我们学习 Python 的异常以及如何在你的代码中处理它们. 异常 在程序执行过程中发生的任何错误都是异常.每个异常显示一些相关的错误信息,比如你在 Python3 中使用 Python2 独有 ...
- Python3简明教程(九)—— 文件处理
文件是保存在计算机存储设备上的一些信息或数据.你已经知道了一些不同的文件类型,比如你的音乐文件,视频文件,文本文件.Linux 有一个思想是“一切皆文件”,这在实验最后的 lscpu 的实现中得到了体 ...
- Python3简明教程(六)—— 数据结构
简单的来说,数据结构(data structure)是计算机中存储.组织数据的方式.比如我们之前使用过的列表就是一种数据结构,在这里我们还会深入学习它.之前也有简单的介绍. 列表 >>&g ...
- Python3简明教程(一)—— 开始Python之旅
第一个Python程序 作为我们第一个Python程序——打印"Hello World!". 在终端输入Python3进入交互界面: 输入print("Hello W ...
- 实验楼-python3简明教程笔记
#!/usr/bin/env python3 days = int(input("Enter days: ")) print("Months = {} Days = {} ...
随机推荐
- [51nod 1129] 字符串最大值(kmp)
传送门 题目大意 求一个字符串的前 缀出现次数乘以长度的最大值. 题解 暴力枚举每一个前缀求出现次数再乘以常数取最大 这样做会T几个点 看了老师的做法是任意前缀出现的次数,它的next也会出现这些次数 ...
- bzoj4547
矩阵乘法 看成了合并果子... 就是斐波那契数列,只是有负数的时候,先把负数变成正的,然后矩乘 矩乘还是用单位举矩阵记录快速幂的矩阵比较保险 #include<cstdio> #inclu ...
- sharepoint服务器修改密码后出现HTTP Error 503
HTTP Error 503 解决办法: 更改sharepoint 网站应用程序池标示后,更改标示重新输入管理员密码,问题解决!
- MyEclipse10.0的破解过程详细图解
1 首先下载破解软件包:http://pan.baidu.com/s/1pLB6xEb 并解压: 2 按照百度经验操作即可http://jingyan.baidu.com/article/cbf0e5 ...
- notepad++的NppFTP插件远程连接linux操作系统
1.首先要有NppFTP插件,如果没有可以去下面链接或者其他网站下载: https://sourceforge.net/projects/nppftp/files/latest/download ...
- 详解Supervisor进程守护监控
Supervisor在百度百科上给的定义是超级用户,监管员.Supervisor是一个进程管理工具,当进程中断的时候Supervisor能自动重新启动它.可以运行在各种类unix的机器上,superv ...
- python slice 切片
list,tuple,string,bytes对象可以进行切片处理,生成一个新的这些类的对象. 格式:li[start: stop: step] list切片: >>> li = [ ...
- web移动端下拉加载数据简单实现
//下拉加载在移动端会经常使用,有些小伙伴不清楚一些原理下面就简答的介绍一下 //首先需要监听window的滚动事件,下拉其实就是在监听window滚动事件 var pageNum = 1;//分页第 ...
- 第十三篇 .NET高级技术之事件
案例:定一个Person类,定一个监听年龄变化的事件,当本命年的时候祝贺一下.触发事件的地方要判断一下是不是事件null 事件语法:event Mydelegate mdl; 加了event关键字实现 ...
- java实现数据结构
数据结构与算法 :一.数据结构和算法简介 数据结构是指数据在计算机存储空间中的安排方式,而算法时值软件程序用来操作这些结构中的数据的过程.二. 数据结构和算法的重要性 几乎所有的程序都会使用到数据结构 ...