老男孩python学习自修第十八天【面向对象】
1.类与对象(构造方法与实例化)
#!/usr/bin/env python
# _*_ coding:UTF-8 _*_
class Province:
def __init__(self, name, capital, leader):
self.name = name
self.capital = capital
self.leader = leader
if __name__ == "__main__":
hebei = Province("河北", "石家庄", "刘道强")
print hebei.name
print hebei.capital
print hebei.leader
结果:
/Users/liudaoqiang/PycharmProjects/numpy/venv/bin/python /Users/liudaoqiang/Project/python_project/day05/day18/Province.py 河北 石家庄 刘道强 Process finished with exit code 0
注意:定义构造方法使用__init__方法
2.动态字段与静态字段
#!/usr/bin/env python
# _*_ coding:UTF-8 _*_
class Province:
memo = "中国的23个省之一"
def __init__(self, name, capital, leader):
self.name = name
self.capital = capital
self.leader = leader
if __name__ == "__main__":
hebei = Province("河北", "石家庄", "刘道强")
print hebei.name
print hebei.capital
print hebei.leader
print hebei.memo
print Province.memo
结果:
/Users/liudaoqiang/PycharmProjects/numpy/venv/bin/python /Users/liudaoqiang/Project/python_project/day05/day18/Province.py 河北 石家庄 刘道强 中国的23个省之一 中国的23个省之一 Process finished with exit code 0
注意:
(1)类不能访问动态字段
(2)对象可以访问静态字段
3.动态方法与静态方法
#!/usr/bin/env python
# _*_ coding:UTF-8 _*_
class Province:
memo = "中国的23个省之一"
def __init__(self, name, capital, leader):
self.name = name
self.capital = capital
self.leader = leader
def sports_meeting(self):
return self.name + "正在开运动会"
@staticmethod
def foo():
return "每个省都在反腐"
if __name__ == "__main__":
hebei = Province("河北", "石家庄", "刘道强")
print hebei.name
print hebei.capital
print hebei.leader
print hebei.memo
print Province.memo
print hebei.sports_meeting()
print hebei.foo()
print Province.foo()
结果:
/Users/liudaoqiang/PycharmProjects/numpy/venv/bin/python /Users/liudaoqiang/Project/python_project/day05/day18/Province.py 河北 石家庄 刘道强 中国的23个省之一 中国的23个省之一 河北正在开运动会 每个省都在反腐 每个省都在反腐 Process finished with exit code 0
注意:
(1)类不能访问动态方法
(2)对象可以方位静态方法
(3)在动态方法上增加@staticmethod并去除self参数则为动态方法
4.特性
#!/usr/bin/env python
# _*_ coding:UTF-8 _*_
class Province:
memo = "中国的23个省之一"
def __init__(self, name, capital, leader):
self.name = name
self.capital = capital
self.leader = leader
def sports_meeting(self):
return self.name + "正在开运动会"
@staticmethod
def foo():
return "每个省都在反腐"
@property
def bar(self):
return self.name
if __name__ == "__main__":
hebei = Province("河北", "石家庄", "刘道强")
print hebei.name
print hebei.capital
print hebei.leader
print hebei.memo
print Province.memo
print hebei.sports_meeting()
print hebei.foo()
print Province.foo()
print hebei.bar
结果:
/Users/liudaoqiang/PycharmProjects/numpy/venv/bin/python /Users/liudaoqiang/Project/python_project/day05/day18/Province.py 河北 石家庄 刘道强 中国的23个省之一 中国的23个省之一 河北正在开运动会 每个省都在反腐 每个省都在反腐 河北 Process finished with exit code 0
注意:
(1)在方法上增加@property则该方法变为字段访问
5.面向对象中动态方法与静态方法的比较
(1)使用动态方法适合于业务类;适用于对象数量较少的情况
(2)使用静态方法适合于工具类;适用于对象数量较多的情况,当对象较多则创建对象占用大量的内存这时应该使用静态方法
6.私有字段与私有方法
#!/usr/bin/env python
# _*_ coding:UTF-8 _*_
class Province:
memo = "中国的23个省之一"
def __init__(self, name, capital, leader, __thailand):
self.name = name
self.capital = capital
self.leader = leader
self.__thailand = __thailand
def sports_meeting(self):
return self.name + "正在开运动会"
@staticmethod
def foo():
return "每个省都在反腐"
@property
def bar(self):
return self.name
@property
def thailand(self):
return self.__thailand
if __name__ == "__main__":
hebei = Province("河北", "石家庄", "刘道强", True)
print hebei.name
print hebei.capital
print hebei.leader
print hebei.memo
print Province.memo
print hebei.sports_meeting()
print hebei.foo()
print Province.foo()
print hebei.bar
print hebei.thailand
结果:
/Users/liudaoqiang/PycharmProjects/numpy/venv/bin/python /Users/liudaoqiang/Project/python_project/day05/day18/Province.py 河北 石家庄 刘道强 中国的23个省之一 中国的23个省之一 河北正在开运动会 每个省都在反腐 每个省都在反腐 河北 True Process finished with exit code 0
注意:
(1)任何暴露给外部是无用的,或者为了安全不能暴露给外部的字段和方法需要设置为私有;设置私有字段和私有方法只需在前边加上两个下划线即可
(2)私有字段在类内部可以直接访问,在类外部不能访问,可以通过实现特性来访问私有字段
(3)私有方法在类内部可以直接访问,在类外部不能访问,可以通过封装共有方法来访问私有方法
7.只读特性与可写特性
#!/usr/bin/env python
# _*_ coding:UTF-8 _*_
class Province:
memo = "中国的23个省之一"
def __init__(self, name, capital, leader, __thailand):
self.name = name
self.capital = capital
self.leader = leader
self.__thailand = __thailand
def sports_meeting(self):
return self.name + "正在开运动会"
@staticmethod
def foo():
return "每个省都在反腐"
@property
def bar(self):
return self.name
@property
def thailand(self):
return self.__thailand
@thailand.setter
def thailand(self, __thailand):
self.__thailand = __thailand
if __name__ == "__main__":
hebei = Province("河北", "石家庄", "刘道强", True)
print hebei.name
print hebei.capital
print hebei.leader
print hebei.memo
print Province.memo
print hebei.sports_meeting()
print hebei.foo()
print Province.foo()
print hebei.bar
print hebei.thailand
hebei.thailand = False
print hebei.thailand
结果:
/Users/liudaoqiang/PycharmProjects/numpy/venv/bin/python /Users/liudaoqiang/Project/python_project/day05/day18/Province.py 河北 石家庄 刘道强 中国的23个省之一 中国的23个省之一 河北正在开运动会 每个省都在反腐 每个省都在反腐 河北 True False Process finished with exit code 0
/Users/liudaoqiang/PycharmProjects/numpy/venv/bin/python /Users/liudaoqiang/Project/python_project/day05/day18/Province.py 河北 石家庄 刘道强 中国的23个省之一 中国的23个省之一 河北正在开运动会 每个省都在反腐 每个省都在反腐 河北 True False Process finished with exit code 0
注意
(1)使用@property装饰器则私有字段可读;使用@field.setter则私有字段可写
8.构造方法__init__(),析构方法__del__()和__call__()
#!/usr/bin/env python
# _*_ coding:UTF-8 _*_
class Province:
memo = "中国的23个省之一"
def __init__(self, name, capital, leader, __thailand):
self.name = name
self.capital = capital
self.leader = leader
self.__thailand = __thailand
def __call__(self, *args, **kwargs):
print "CALL"
def __del__(self):
print "DELETE"
def sports_meeting(self):
return self.name + "正在开运动会"
@staticmethod
def foo():
return "每个省都在反腐"
@property
def bar(self):
return self.name
@property
def thailand(self):
return self.__thailand
@thailand.setter
def thailand(self, __thailand):
self.__thailand = __thailand
if __name__ == "__main__":
hebei = Province("河北", "石家庄", "刘道强", True)
print hebei.name
print hebei.capital
print hebei.leader
print hebei.memo
print Province.memo
print hebei.sports_meeting()
print hebei.foo()
print Province.foo()
print hebei.bar
print hebei.thailand
hebei.thailand = False
print hebei.thailand
hebei()
结果:
/Users/liudaoqiang/PycharmProjects/numpy/venv/bin/python /Users/liudaoqiang/Project/python_project/day05/day18/Province.py 河北 石家庄 刘道强 中国的23个省之一 中国的23个省之一 河北正在开运动会 每个省都在反腐 每个省都在反腐 河北 True False CALL DELETE Process finished with exit code 0
注意:
__init__(self)在创建对象的时候触发调用
__del__(self)在销毁对象的时候触发调用
__call__(self)在对象()调用时触发调用
9.类的继承
#!/usr/bin/env python
# _*_ coding:UTF-8 _*_
class Base:
def __int__(self):
pass
def __call__(self, *args, **kwargs):
pass
def __del__(self):
pass
def foo(self):
print "foo"
def bar(self):
print "bar"
class Derive(Base):
def __int__(self):
pass
def __call__(self, *args, **kwargs):
pass
def __del__(self):
pass
def bar(self):
Base.bar(self)
print "derive"
if __name__ == "__main__":
base = Base()
base.foo()
base.bar()
derive = Derive()
derive.foo()
derive.bar()
结果:
/Users/liudaoqiang/PycharmProjects/numpy/venv/bin/python /Users/liudaoqiang/Project/python_project/day05/day18/extend_test.py foo bar foo bar derive Process finished with exit code 0
注意:
(1)继承只需要的类名的后面加上基类的名称
(2)调用基类的方法则用Base.bar(self)
10. 多继承
经典类的深度优先多继承:
#!/usr/bin/env python
# _*_ coding:UTF-8 _*_
class A:
def __init__(self):
print "init A"
def save(self):
print "save from A"
class B(A):
def __init__(self):
print "init B"
class C(A):
def __init__(self):
print "init C"
def save(self):
print "save from C"
class D(B, C):
def __init__(self):
print "init D"
if __name__ == "__main__":
d = D()
d.save()
结果:
/Users/liudaoqiang/PycharmProjects/numpy/venv/bin/python /Users/liudaoqiang/Project/python_project/day05/day18/object_test.py init D save from A Process finished with exit code 0
新式类的广度优先多继承:
#!/usr/bin/env python
# _*_ coding:UTF-8 _*_
class A(object):
def __init__(self):
print "init A"
def save(self):
print "save from A"
class B(A):
def __init__(self):
print "init B"
class C(A):
def __init__(self):
print "init C"
def save(self):
print "save from C"
class D(B, C):
def __init__(self):
print "init D"
if __name__ == "__main__":
d = D()
d.save()
结果:
/Users/liudaoqiang/PycharmProjects/numpy/venv/bin/python /Users/liudaoqiang/Project/python_project/day05/day18/object_test.py init D save from C Process finished with exit code 0
注意:
(1)python中的类如果不继承object则为经典类,如果继承object类则为新式类
(2)经典类的多继承采用深度优先算法继承,新式类的多继承采用广度优先算法继承
11.接口,抽象类,抽象方法
例如:
#!/usr/bin/env python
# _*_ coding:UTF-8 _*_
from abc import ABCMeta, abstractmethod
class Foo:
__metaclass__ = ABCMeta
def save(self):
pass
class Bar(Foo):
def __init__(self):
print "init Bar"
def save(self):
print "save from Bar"
if __name__ == "__main__":
bar = Bar()
bar.save()
结果:
/Users/liudaoqiang/PycharmProjects/numpy/venv/bin/python /Users/liudaoqiang/Project/python_project/day05/day18/abstract_test.py init Bar save from Bar Process finished with exit code 0
注意:
(1)抽象类中只有抽象方法即为借口
(2)类中有__metaclass__ = ABCMeta的类即为抽象类;方法被@abstractmethod装饰即为抽象方法
老男孩python学习自修第十八天【面向对象】的更多相关文章
- 老男孩python学习自修第二十四天【多进程】
1. 体验多进程的运行速度 #!/usr/bin/env python # _*_ coding:UTF-8 _*_ from multiprocessing import Pool import t ...
- 老男孩python学习自修第二十三天【多线程】
1. 线程的创建与运行 #!/usr/bin/env python # _*_ coding:UTF-8 _*_ from threading import Thread def foo(param1 ...
- 老男孩 python学习自修第二十二天【文件上传与下载】
1.使用socket实现文件上传 server.py #!/usr/bin/env python # _*_ coding:UTF-8 _*_ import os import SocketServe ...
- 老男孩python学习自修第十九天【异常处理】
1.常见的错误 TypeError 类型错误 NameError 没有该变量 ValueError 不期望的值 AttributeError 没有该属性 UnboundLocalError 没有该局部 ...
- 老男孩python学习自修第十七天【装饰器】
装饰器:在某个方法执行前后去执行其他新定义的行为 例如: #!/usr/bin/env python # _*_ coding:UTF-8 _*_ def before_say_hello(): pr ...
- 老男孩python学习自修第十六天【常用模块之sys和os】
例子: sys.argv 命令行参数List,第一个元素是程序本身路径 sys.exit(n) 退出程序,正常退出时exit(0) sys.version 获取Python解释程序的版本信息 sys. ...
- 老男孩python学习自修第十五天【常用模块之time】
例如: #!/usr/bin/env python # _*_ coding:UTF-8 _*_ import time if __name__ == "__main__": pr ...
- 老男孩python学习自修第十四天【序列化和json】
序列化是使用二进制的方式加密列表,字典或集合,反序列化是解密的过程:序列化开启了两个独立进程进行数据交互的通路 使用pickle进行序列化和反序列化 例如: pickle_test.py #!/usr ...
- 老男孩python学习自修第十三天【md5加密】
示例代码如下: hashlib_test.py #!/usr/bin/env python # _*_ coding:UTF-8 _*_ import hashlib def genPasswd(na ...
随机推荐
- 网站建设部署与发布--笔记4-部署mysql
部署MySQL 1.更新操作系统 $ yum update -y 2.安装mysql数据库,在CentOS 7.2 中,使用了mariadb替代了官方的mysql $ yum install mari ...
- P1365 WJMZBMR打osu! / Easy-洛谷luogu
传送门 题目背景 原 维护队列 参见P1903 题目描述 某一天WJMZBMR在打osu~~~但是他太弱逼了,有些地方完全靠运气:( 我们来简化一下这个游戏的规则 有nn次点击要做,成功了就是o,失败 ...
- [MicroPython]TPYBoardv102超全DIY案例一览
TPYBoardv102是一款比较成熟和经典的MicroPython开发板,不仅适用于学习实验还能应用于大型的工业级开发,是MicroPython入门和研发的不二之选.下面我们就扒开v102的“层层外 ...
- [TPYBoard - Micropython之会python就能做硬件 8] 学习使用超声波模块制作避障小车
转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi 欢迎加入讨论群 64770604 一.实验器材 1.TPYboard V102板 一块 2.电机驱动模块L2 ...
- python:利用xlrd模块操作excel
在自动化测试过程中,对测试数据的管理和维护是一个不可忽视的点.一般来说,如果测试用例数据不是太多的话,使用excel管理测试数据是个相对来说不错的选择. 这篇博客,介绍下如何利用python的xlrd ...
- .NET Core中复制源文件夹下的所有内容到新文件夹
.NET Core中没有原生的复制文件夹方法,我们可以自己写个: 新建一个.NET Core控制台项目,示例代码如下: using System; using System.IO; namespace ...
- EF CRUD
EF 使用心得 有点傻逼! 1.通常情况 表实例一个对象 T_User model = new T_User(); 2.关键 非空字段赋值主键必须要写 model.EID = "009&qu ...
- 使用docker Registry快速搭建私有镜像仓库
当我们执行docker pull xxx的时候,docker默认是从registry.docker.com这个地址上去查找我们所需要的镜像文件,然后执行下载操作.这类的镜像仓库就是docker默认的公 ...
- SpringBoot集成Apache Shiro
笔者因为项目转型的原因,对Apache Shiro安全框架做了一点研究工作,故想写点东西以便将来查阅.之所以选择Shiro也是看了很多人的推荐,号称功能丰富强大,而且易于使用.实践下来的确如大多数人所 ...
- 【IE11请求中止】 XMLHttpRequest: 网络错误 0x2ef3的意外出现
BUG现象 今天排查BUG遇到一个有趣的BUG,测试的截图显示 这个BUG只在IE11下出现. BUG原因 这个问题的原因是keep-alive机制引起. 当浏览器在向一个网址发起请求时,会建立一个t ...