python学习面向对象_Python小白必学的面向对象
我们已经知道在Python中“一切皆对象”,每个对象都有特定的类型,现在让我们来尝试创建自己的类型——这需要使用class关键字来定义新的“类”(Class),类是用来生成对象的“模板”,对象则是其所属类的“实例”——以下是在交互模式中自定义Thing类,并调用其默认构造器生成一个Thing类的实例对象(注意:自定义类的命名规范要求单词首字母大写):In [1]: class Thing:
...: """最简单的自定义类"""
...:
In [2]: type(Thing)
Out[2]: type
In [3]: t = Thing()
In [4]: type(t)
Out[4]: __main__.Thing
可以看到,Thing对象属于type类型,是type类的一个实例;t对象属于Thing类型,是Thing类的一个实例——当你在程序中定义自己的类来生成实例对象,就算是“面向对象编程”(Object-Oriented Programming,简称OOP)。面向对象的编程方式使用类来模拟和组织现实世界的事物,可以令程序结构更灵活、条理更清晰。
上面定义的Thing类所生成的实例对象并不能做什么事情,让我们再来创建一个包含了具体子语句的“船”类并生成两个“船”对象:In [5]: class Ship:
...: """船类"""
...: def __init__(self, name=None):
...: """初始化船实例"""
...: self.name = name # 船名
...: self.crew = 0 # 船员人数
...: def join(self, number):
...: """船员加入"""
...: self.crew += number
...: return self.crew
...:
In [6]: s1 = Ship("郑和")
In [7]: s1.crew = 200
In [8]: s2 = Ship("戚继光")
In [9]: s2.join(100)
Out[9]: 100
In [10]: s2.crew
Out[10]: 100
Ship类定义了一个特殊的“初始化”方法__init__,这样就能在调用构造器生成实例时加入新的实例“属性”(Property),所谓实例属性就是实例对象的“成员变量”,例如Ship类的实例增加了name和crew属性——从现实概念来理解,任何船都有船名和船员人数这两个数据,但每艘船又有各自的具体数据值。实例属性和实例方法是最常见的两种类成员,Python规定特殊类成员名以两个下划线开始和结束,其他类成员名遵循标准的变量命名规范,注意这里有一个细节概念:作为类成员的__init__属于函数,作为实例成员的__init__则属于方法,在类中定义函数时约定首个参数为“self”,它会指向所生成的实例对象以便操作其成员,对应的实例方法则无此参数,所以调用Ship构造器时只需传入一个参数(也可以不传入任何参数,因为name指定了默认值)。除了实例属性,你也可以定义新的实例方法,让实例能够做更多的事情——例如“船”类还有一个“船员加入”方法。In [11]: help(Ship)
Help on class Ship in module __main__:
class Ship(builtins.object)
| 船类
|
| Methods defined here:
|
| __init__(self, name=None)
| 初始化船实例
|
| join(self, number)
| 船员加入
|
| ----------------------------------------------------------------------
| Data descriptors defined here:
|
| __dict__
| dictionary for instance variables (if defined)
|
| __weakref__
| list of weak references to the object (if defined)
In [12]: type(Ship.__init__)
Out[12]: function
In [13]: type(s2.__init__)
Out[13]: method
In [14]: s1.__dict__
Out[14]: {'crew': 200, 'name': '郑和'}
实例对象之所以拥有不必自定义而默认存在的特殊成员,是因为面向对象编程的一个重要特性“继承”(Inheritance)——使用继承机制能够将复杂的系统有机地组织起来,所有类都是同一个庞大家族的成员——定义类时可以在类名后加括号指定“基类”,新类将成为其“子类”;如果不指定基类,就默认为最基本的“object”类的子类。子类会继承基类的现有成员,子类定义属性和方法时如果与基类成员同名,就会“覆盖”基类成员。例如下面的程序定义了“船”类及其子类“战舰”类:"""ship.py 船的家族"""
class Ship:
"""船类"""
def __init__(self, name=None):
"""初始化船实例"""
self.name = name # 船名
self.crew = 0 # 船员人数
def join(self, number):
"""船员加入"""
self.crew += number
return self.crew
class Warship(Ship):
"""战舰类"""
def __init__(self, name=None, level=None):
super().__init__(name) # 先调用基类初始化方法
self.level = level # 舰级
if __name__ == "__main__":
ws1 = Warship("蓝色空间", "恒星级")
ws1.join(500)
print("{}战舰{}号,现有舰员{}人。".format(ws1.level, ws1.name, ws1.crew))
可以注意到Warship类重新定义了__init__,这就会覆盖Ship类中的__init__,所以先调用基类的__init__才能继承到基类定义的实例属性name和crew。
接下来的示例是一个简单的计算器:"""tkcalc.pyw 简单的计算器
"""
import tkinter as tk
class Calc(tk.Tk):
"""计算器窗体类"""
def __init__(self):
"""初始化实例"""
tk.Tk.__init__(self)
self.title("计算器")
self.memory = 0 # 暂存数值
self.create()
def create(self):
"""创建界面"""
btn_list = ["C", "M->", "->M", "/",
"7", "8", "9", "*",
"4", "5", "6", "-",
"1", "2", "3", "+",
"+/-", "0", ".", "="]
r = 1
c = 0
for b in btn_list:
self.button = tk.Button(self, text=b, width=5,
command=(lambda x=b: self.click(x)))
self.button.grid(row=r, column=c, padx=3, pady=6)
c += 1
if c > 3:
c = 0
r += 1
self.entry = tk.Entry(self, width=24, borderwidth=2,
bg="yellow", font=("Consolas", 12))
self.entry.grid(row=0, column=0, columnspan=4, padx=8, pady=6)
def click(self, key):
"""响应按钮"""
if key == "=": # 输出结果
result = eval(self.entry.get())
self.entry.insert(tk.END, " = " + str(result))
elif key == "C": # 清空输入框
self.entry.delete(0, tk.END)
elif key == "->M": # 存入数值
self.memory = self.entry.get()
if "=" in self.memory:
ix = self.memory.find("=")
self.memory = self.memory[ix + 2:]
self.title("M=" + self.memory)
elif key == "M->": # 取出数值
if self.memory:
self.entry.insert(tk.END, self.memory)
elif key == "+/-": # 正负翻转
if "=" in self.entry.get():
self.entry.delete(0, tk.END)
elif self.entry.get()[0] == "-":
self.entry.delete(0)
else:
self.entry.insert(0, "-")
else: # 其他键
if "=" in self.entry.get():
self.entry.delete(0, tk.END)
self.entry.insert(tk.END, key)
if __name__ == "__main__":
Calc().mainloop()
python学习面向对象_Python小白必学的面向对象相关推荐
- python编程输入_Python编程必学的文件输入,处理和输出,小白也可以学会的教程...
通过本节的学习,你将了解以下内容: 文件,不管是对计算机科班的,还是打酱油路过的,都不是一个陌生的词汇. 那么,什么是文件呢? 额呃,这个问题,没认真想过,好比我们一直是个人,却没想过怎样才是真真正正 ...
- Python学习教程(Python学习视频_Python学些路线):Day05 总结和练习
Python学习教程(Python学习视频_Python学些路线):总结和练习 练习清单 寻找"水仙花数". 寻找"完美数". "百钱百鸡" ...
- Python学习教程(Python学习路线_Python基础学习教程_Python视频教程):初学者新手怎样快速入门Python
Python学习教程(Python学习路线_Python基础学习教程_Python视频教程):初学者新手怎样快速入门Python? 人生苦短,我用Python!!!短短几个字,现在在各大学习类平台随处 ...
- 小白必学的爬虫基础(二)
爬虫基础知识 网络爬虫 爬虫可以解决的问题 爬虫工程师的进阶之路 搜索引擎 搜索引擎的主要组成 搜索引擎的工作流程 搜索引擎的局限性 聚焦爬虫 爬虫准备工作 robots协议 sitemap–网站地图 ...
- win10切换输入法快捷键_电脑小白必学的5个Win10技巧
原标题:电脑小白必学的5个Win10技巧 Win10发布到现在已经5年了,从最开始的全民吐槽,到现在更新换代全面普及,Win10的优点逐渐被大家发掘受用.今天小E为大家介绍一些Win10使用技巧与软件 ...
- Python学习教程(Python学习视频_Python学习路线):Day04循环结构
Python学习教程(Python学习视频_Python学习路线):循环结构 循环结构的应用场景 如果在程序中我们需要重复的执行某条或某些指令,例如用程序控制机器人踢足球,如果机器人持球而且还没有进入 ...
- 笔记本电脑linux系统下载,荣耀笔记本Linux版安装Windows系统,电脑小白必学的一招!...
荣耀笔记本Linux版安装Windows系统,电脑小白必学的一招! 2019-11-13 11:02:23 1点赞 11收藏 0评论 看到Linux系统的笔记本,相信懂行的小伙伴已经猜到了.没错,今天 ...
- 小白必学教程Python编码
机器不是永动机,它也会出错,也会药停下来歇歇.相对的一条代码也不是那么的永远可靠,可能在运行中出现很多不可预知的错误,所以今天我们就来了解一下Python编码错误. python中运行显示编码错误一般 ...
- python自学路线-零基础Python学习路线,小白的进阶之路!
近几年Python的受欢迎程度可谓是扶摇直上,当然了学习的人也是愈来愈多.一些学习Python的小白在学习初期,总希望能够得到一份Python学习路线图,小编经过多方汇总为大家汇总了一份Python学 ...
最新文章
- post上传代码实现
- Spring--IoC(2)
- 技术分享 | 基于EOS的Dapp开发
- c语言函数编正切余切运算,浅谈正切函数与余切函数的应用
- 小伙子自学C++编程简单DIY,即让你拥有一个屏幕画笔,非常实用!
- GStreamer的Decodebin插件
- fastreport5破解版 V5.2.3
- OneNote | OneNote 备份(线上+本地)
- itunes下载的软件所在目录
- 如何用电脑玩石器时代M 石器时代M手游PC电脑版教程
- kettle作业发送QQ邮箱提醒
- BUUCTF RSA2
- 2008年8月5号,晴,今天天气开始变热了。业精于勤,荒于嬉。—— 韩 愈《进学解》
- 开放大学建筑构造计算机考试试题,精编最新国家开放大学电大《建筑构造》形考任务2试题及答案...
- 数据挖掘综合应用:房屋售价预测案例
- UEFI sec阶段的实现
- 大学生体育运动网页设计模板代码 校园篮球网页作业成品 学校篮球网页制作模板 学生简单体育运动网站设计成品
- 新手小白做短视频自媒体,入门流程分享,让你少走很多弯路
- java毕业生设计中小学家校通系统计算机源码+系统+mysql+调试部署+lw
- 产品健康度模型(1) 任务介绍