[Python学习笔记][第六章Python面向对象程序设计]
1月29日学习内容
Python面向对象程序设计
类的定义与使用
类定义语法
使用class关键词
class Car:
def infor(self):
print("This is car")
self参数
类的所有实例方法都必须至少有一个名为self的参数,并且必须是方法的第一个形参
self参数代表将来要创建的对象本身
实际上也没可以不用self 而取别的名字,但这是约定俗成的事
class A:
def __init__(hahaha, v):
hahaha.value=v
def show(hahaha):
return hahaha.value
a=A(3)
a.show()
类成员与实例成员
实例属性
实例属性一般是指在构造函数init()中定义的,定义与使用必须以self作为前缀;
类属性
是在类中所有方法以外定义的数据成员
两者区别
在主程序中
实例属性属于实例,只能通过对象名访问
而类属性属于类 ,可以通过类名和对象名访问
Python优点
可以动态的为类对象增加成员
私有成员和公有成员
私有属性
如果属性名以两个下划线”__”(中间无空)开头则表示是私有属性
大多数跟其他语言一样,但是Python支持的特殊方式访问 对象._类名__xxx
_xxx
这样的对象叫做保护成员,不能用”from module import *”导入,只有类对象和子类对象能访问这些成员
__xxx__
系统定义的特殊成员,非私有成员
__xxx
只有类对象自己能访问,子类对象也不能访问到这个成员,但可以用对象名._类名__xxx这样的特殊方式访问.
方法
共有方法
通过对象名直接调用,在方法中也要用self
如果通过类名来调用属于对象的共有方法,需要显示为改方法的self参数传递一个对象名,用来明确指定访问那个对象的数据成员
公有方法
__来命名
不能通过对象名直接调用,只能在属于对象的方法中通过self调用或在外部通过特殊方法调用
静态方法和类方法
都可以通过类名和对象名来调用
但只能访问属于类的成员,而不能访问属于对象的成员
类方法
一般将cls作为类方法的第一个参数名称.
需要在前面加一个@classmethod的修饰符 表示下一个方法为类方法
@classmethod
def classShowTotal(cls):
print(cls.__value)
静态方法
不需要参数名
需要在前面加一个@staticmethod的修饰符 表示下一个方法为静态方法
class Root:
__total=0;
def __init__(self,v):
self.__value=v
Root.__total+=1
def show(self):
print('self.__value:',self.__value)
print('Root.__total:',Root.__total)
@classmethod #修饰符
def classShowTotal(cls): #类方法
print(cls.__total)
@staticmethod #修饰符
def staticShowTotal():
print(Root.__total)
r=Root(3)
r.classShowTotal() ##类方法可以用对象调用
#1
r.staticShowTotal() ##静态方法也可以用对象调用
#1
r.show()
#self.__value: 3
#Root.__total: 1
rr=Root(5)
Root.classShowTotal() ##类方法可以用类调用
#2
Root.staticShowTotal() ##静态方法也可以用类调用
#2
Root.show(r) ##为self显示传递对象名
#self.__value: 3
#Root.__total: 2 证明__total只有一个
r.show()
#self.__value: 3
#Root.__total: 2
属性
python2.X的属性没有实质的意义 无法起到保护的作用。当建立一个只读的属性时
如果修改其值,虽然并不会真正的修改,修改的时候其实是新建了一个变量会把这个属性隐藏。所以十分鸡肋python 3.X中 得到较为完整的实现
用@property 标识符表示下一个方法是 属性方法
用property(__get,__set__del)的方法设置 ,不需要的参数可以用None
具体看以下代码
只读属性
class Test:
def __init__(self,value):
self.__value=value
@property
def value(self):
return self.__value
t=Test(3);
print(t.value)
#3
t.value=5;
#AttributeError: can't set attribute
可读可修改
class Test:
def __init__(self,value):
self.__value=value
def __get(self):
return self.__value
def __set(self,v):
self.__value=v;
value=property(__get,__set)
t=Test(3)
print(t.value)
#3
t.value=5;
print(t.value)
#5
可读可修改可删除
class Test:
def __init__(self,value):
self.__value=value
def __get(self):
return self.__value
def __set(self,v):
self.__value=v;
def __del(self):
del self.__value
value=property(__get,__set,__del)
t=Test(3)
print(t.value)
#3
t.value=5;
print(t.value)
#5
del t.value
系统自己补出的代码 有待研究 很厉害的样子
class Test:
def __init__(self,value):
self.__value=value
def value():
doc = "The value property."
def fget(self):
return self.__value
def fset(self, value):
self.__value = value
def fdel(self):
del self.__value
return locals()
value = property(**value())
特殊方法于运算符重载
常用特殊方法
- 构造函数__init()__
- 析构函数__del()__
__add__() , __radd__()
左+,右+
__sub__
-
__mul__
*
__div()_ ,__truediv_()
Python 2.x使用div(),Python3.X使用turediv()
__floordiv__()
整除
__mod__()
取余
__pow__()
**
__cmp__()
__repr__()
打印 转换
__setitem__()
按照索引赋值
__getitem__()
按照索引获取值
__len__()
计算长度
__call__()
函数调用
__contains__()
测试是否包含某个元素
__eq__() ,__ne__() ,__lt__() ,__le__() ,__gt__() ,__ge__()
==,!=,<,<=,>,>=
__str__()
转化为字符串
__lshift__() ,__lshift__()
<<,>>
__and__() ,__or__() ,__invert__()
&,|,~
__iadd__() ,__isub__()
+=,-=
继承
class 类名(继承的类名):
pass
有时间补充
slots
但是,如果我们想要限制实例的属性怎么办?比如,只允许对Student实例添加name和age属性。
为了达到限制的目的,Python允许在定义class的时候,定义一个特殊的slots变量,来限制该class实例能添加的属性:
class Student(object):
__slots__ = ('name', 'age') # 用tuple定义允许绑定的属性名称
使用slots要注意,slots定义的属性仅对当前类实例起作用,对继承的子类是不起作用的:
[Python学习笔记][第六章Python面向对象程序设计]的更多相关文章
- [Python学习笔记][第七章Python文件操作]
2016/1/30学习内容 第七章 Python文件操作 文本文件 文本文件存储的是常规字符串,通常每行以换行符'\n'结尾. 二进制文件 二进制文件把对象内容以字节串(bytes)进行存储,无法用笔 ...
- [Python学习笔记][第五章Python函数设计与使用]
2016/1/29学习内容 第四章 Python函数设计与使用 之前的几页忘记保存了 很伤心 变量作用域 -一个变量已在函数外定义,如果在函数内需要修改这个变量的值,并将这个赋值结果反映到函数之外,可 ...
- [Python学习笔记][第四章Python字符串]
2016/1/28学习内容 第四章 Python字符串与正则表达式之字符串 编码规则 UTF-8 以1个字节表示英语字符(兼容ASCII),以3个字节表示中文及其他语言,UTF-8对全世界所有国家需要 ...
- Python学习笔记 -- 第六章 文件操作
I/O编程 在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘,所以,读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后,通过操作系统提供的接口从这 ...
- Python 学习笔记(六)Python第一个程序
Python 语句 赋值语句 1.将3对象赋值给了变量a 2.将3,4赋值给了变量a,b >>> a = 3 >>> a ,b = 3,4 >>> ...
- Python学习笔记(六)Python组合数据类型
在之前我们学会了数字类型,包括整数类型.浮点类型和复数类型,这些类型仅能表示一个数据,这种表示单一数据的类型称为基本数据类型.然而,实际计算中却存在大量同时处理多个数据的情况,这种需要将多个数据有效组 ...
- python学习笔记(六)文件夹遍历,异常处理
python学习笔记(六) 文件夹遍历 1.递归遍历 import os allfile = [] def dirList(path): filelist = os.listdir(path) for ...
- Python学习笔记(六)
Python学习笔记(六) Ubuntu重置root密码 Ubuntu 16.4 目录结构 Ubuntu 命令讲解 1. Ubuntu重置root密码 启动系统,显示GRUB选择菜单(如果默认系统启动 ...
- JVM学习笔记-第六章-类文件结构
JVM学习笔记-第六章-类文件结构 6.3 Class类文件的结构 本章中,笔者只是通俗地将任意一个有效的类或接口锁应当满足的格式称为"Class文件格式",实际上它完全不需要以磁 ...
随机推荐
- Material 字体样式与排版
Material 字体样式与排版 Google Material 设计规范文档 Style– Typography 字号 再好的布局也会被过多的字号和样式会毁掉.要规定好在这个布局上合适的 字号集合 ...
- 诡异的SpriteKit 游戏查错
在Endless Runner 游戏中,做了一些atlas后,发现有个问题,当player跳跃起来的时候,发现他没有动画了,被默认的X图片代替.原来的图像是这样的. 在增加了一些动画后,我的效果就成这 ...
- 高级子查询【weber出品必属精品】
多列子查询 where条件中出现多列与子查询进行比较 多列子查询分为:成对比较和非成对比较 成对比较: SQL> select ename,sal,job from emp where (dep ...
- bootstrap小结
bootstrap总结 bootstrap总结 base css 我分为了几大类 1,列表 .unstyled(无样式列表),.dl-horizontal(dl列表水平排列) 2,代码 code(行级 ...
- 洛谷 P1656 炸铁路
P1656 炸铁路 题目提供者kkksc03 标签图论搜索/枚举洛谷原创 难度普及/提高- 题目描述 因为某国被某红色政权残酷的高压暴力统治.美国派出将军uim,对该国进行战略性措施,以解救涂炭的生灵 ...
- 在shell中运行以不同方式运行脚本
在shell当中,可以有3中方式运行脚本: 1 . ./script_name 或者source ./script_name 2 直接./script_name 3 ./script_name &am ...
- oracle 10g RAC psu过程
1 升级crs 至10.2.0.5.2 1) 升级opatch 程序,PSU对opatch的版本有要求,详见readme文件,此步操作共涉及到每个节点的ORACLE_HOME和ORA_CRS_HOME ...
- 使用canvas来实时播放RTSP视频
HTML5的标签可以用使用下来面的方式来播放静态视频 <video width="320" height="240" controls="con ...
- React/React Native的 ES5 ES6 写法对照
ES5 ES6 模块 var React = require("react-native); var { Image, Text, View } = React; import Re ...
- Java之集合类
出处:http://blog.csdn.net/zhangerqing 一.集合类简介 数组是很常用的一种的数据结构,我们用它可以满足很多的功能,但是,有时我们会遇到如下这样的问题: 1.我们需要该容 ...