1月29日学习内容

Python面向对象程序设计

类的定义与使用

类定义语法

使用class关键词

  1. class Car:
  2. def infor(self):
  3. print("This is car")

self参数

类的所有实例方法都必须至少有一个名为self的参数,并且必须是方法的第一个形参

self参数代表将来要创建的对象本身

实际上也没可以不用self 而取别的名字,但这是约定俗成的事

  1. class A:
  2. def __init__(hahaha, v):
  3. hahaha.value=v
  4. def show(hahaha):
  5. return hahaha.value
  6. a=A(3)
  7. a.show()

类成员与实例成员

实例属性

实例属性一般是指在构造函数init()中定义的,定义与使用必须以self作为前缀;

类属性

是在类中所有方法以外定义的数据成员

两者区别

在主程序中

实例属性属于实例,只能通过对象名访问

而类属性属于类 ,可以通过类名和对象名访问

Python优点

可以动态的为类对象增加成员

私有成员和公有成员

私有属性

如果属性名以两个下划线”__”(中间无空)开头则表示是私有属性

大多数跟其他语言一样,但是Python支持的特殊方式访问 对象._类名__xxx

  • _xxx

    这样的对象叫做保护成员,不能用”from module import *”导入,只有类对象和子类对象能访问这些成员

  • __xxx__

    系统定义的特殊成员,非私有成员

  • __xxx

    只有类对象自己能访问,子类对象也不能访问到这个成员,但可以用对象名._类名__xxx这样的特殊方式访问.

方法

共有方法

通过对象名直接调用,在方法中也要用self

如果通过类名来调用属于对象的共有方法,需要显示为改方法的self参数传递一个对象名,用来明确指定访问那个对象的数据成员

公有方法

__来命名

不能通过对象名直接调用,只能在属于对象的方法中通过self调用或在外部通过特殊方法调用

静态方法和类方法

都可以通过类名和对象名来调用

但只能访问属于类的成员,而不能访问属于对象的成员

类方法

一般将cls作为类方法的第一个参数名称.

需要在前面加一个@classmethod的修饰符 表示下一个方法为类方法

  1. @classmethod
  2. def classShowTotal(cls):
  3. print(cls.__value)

静态方法

不需要参数名

需要在前面加一个@staticmethod的修饰符 表示下一个方法为静态方法

  1. class Root:
  2. __total=0;
  3. def __init__(self,v):
  4. self.__value=v
  5. Root.__total+=1
  6. def show(self):
  7. print('self.__value:',self.__value)
  8. print('Root.__total:',Root.__total)
  9. @classmethod #修饰符
  10. def classShowTotal(cls): #类方法
  11. print(cls.__total)
  12. @staticmethod #修饰符
  13. def staticShowTotal():
  14. print(Root.__total)
  15. r=Root(3)
  16. r.classShowTotal() ##类方法可以用对象调用
  17. #1
  18. r.staticShowTotal() ##静态方法也可以用对象调用
  19. #1
  20. r.show()
  21. #self.__value: 3
  22. #Root.__total: 1
  23. rr=Root(5)
  24. Root.classShowTotal() ##类方法可以用类调用
  25. #2
  26. Root.staticShowTotal() ##静态方法也可以用类调用
  27. #2
  28. Root.show(r) ##为self显示传递对象名
  29. #self.__value: 3
  30. #Root.__total: 2 证明__total只有一个
  31. r.show()
  32. #self.__value: 3
  33. #Root.__total: 2

属性

python2.X的属性没有实质的意义 无法起到保护的作用。当建立一个只读的属性时

如果修改其值,虽然并不会真正的修改,修改的时候其实是新建了一个变量会把这个属性隐藏。所以十分鸡肋

python 3.X中 得到较为完整的实现

用@property 标识符表示下一个方法是 属性方法

用property(__get,__set__del)的方法设置 ,不需要的参数可以用None

具体看以下代码

只读属性

  1. class Test:
  2. def __init__(self,value):
  3. self.__value=value
  4. @property
  5. def value(self):
  6. return self.__value
  7. t=Test(3);
  8. print(t.value)
  9. #3
  10. t.value=5;
  11. #AttributeError: can't set attribute

可读可修改

  1. class Test:
  2. def __init__(self,value):
  3. self.__value=value
  4. def __get(self):
  5. return self.__value
  6. def __set(self,v):
  7. self.__value=v;
  8. value=property(__get,__set)
  9. t=Test(3)
  10. print(t.value)
  11. #3
  12. t.value=5;
  13. print(t.value)
  14. #5

可读可修改可删除

  1. class Test:
  2. def __init__(self,value):
  3. self.__value=value
  4. def __get(self):
  5. return self.__value
  6. def __set(self,v):
  7. self.__value=v;
  8. def __del(self):
  9. del self.__value
  10. value=property(__get,__set,__del)
  11. t=Test(3)
  12. print(t.value)
  13. #3
  14. t.value=5;
  15. print(t.value)
  16. #5
  17. del t.value

系统自己补出的代码 有待研究 很厉害的样子

  1. class Test:
  2. def __init__(self,value):
  3. self.__value=value
  4. def value():
  5. doc = "The value property."
  6. def fget(self):
  7. return self.__value
  8. def fset(self, value):
  9. self.__value = value
  10. def fdel(self):
  11. del self.__value
  12. return locals()
  13. 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__()

    +=,-=

继承

  1. class 类名(继承的类名):
  2. pass

有时间补充

slots

但是,如果我们想要限制实例的属性怎么办?比如,只允许对Student实例添加name和age属性。

为了达到限制的目的,Python允许在定义class的时候,定义一个特殊的slots变量,来限制该class实例能添加的属性:

  1. class Student(object):
  2. __slots__ = ('name', 'age') # 用tuple定义允许绑定的属性名称

使用slots要注意,slots定义的属性仅对当前类实例起作用,对继承的子类是不起作用的:

[Python学习笔记][第六章Python面向对象程序设计]的更多相关文章

  1. [Python学习笔记][第七章Python文件操作]

    2016/1/30学习内容 第七章 Python文件操作 文本文件 文本文件存储的是常规字符串,通常每行以换行符'\n'结尾. 二进制文件 二进制文件把对象内容以字节串(bytes)进行存储,无法用笔 ...

  2. [Python学习笔记][第五章Python函数设计与使用]

    2016/1/29学习内容 第四章 Python函数设计与使用 之前的几页忘记保存了 很伤心 变量作用域 -一个变量已在函数外定义,如果在函数内需要修改这个变量的值,并将这个赋值结果反映到函数之外,可 ...

  3. [Python学习笔记][第四章Python字符串]

    2016/1/28学习内容 第四章 Python字符串与正则表达式之字符串 编码规则 UTF-8 以1个字节表示英语字符(兼容ASCII),以3个字节表示中文及其他语言,UTF-8对全世界所有国家需要 ...

  4. Python学习笔记 -- 第六章 文件操作

    I/O编程 在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘,所以,读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后,通过操作系统提供的接口从这 ...

  5. Python 学习笔记(六)Python第一个程序

    Python 语句 赋值语句 1.将3对象赋值给了变量a 2.将3,4赋值给了变量a,b >>> a = 3 >>> a ,b = 3,4 >>> ...

  6. Python学习笔记(六)Python组合数据类型

    在之前我们学会了数字类型,包括整数类型.浮点类型和复数类型,这些类型仅能表示一个数据,这种表示单一数据的类型称为基本数据类型.然而,实际计算中却存在大量同时处理多个数据的情况,这种需要将多个数据有效组 ...

  7. python学习笔记(六)文件夹遍历,异常处理

    python学习笔记(六) 文件夹遍历 1.递归遍历 import os allfile = [] def dirList(path): filelist = os.listdir(path) for ...

  8. Python学习笔记(六)

    Python学习笔记(六) Ubuntu重置root密码 Ubuntu 16.4 目录结构 Ubuntu 命令讲解 1. Ubuntu重置root密码 启动系统,显示GRUB选择菜单(如果默认系统启动 ...

  9. JVM学习笔记-第六章-类文件结构

    JVM学习笔记-第六章-类文件结构 6.3 Class类文件的结构 本章中,笔者只是通俗地将任意一个有效的类或接口锁应当满足的格式称为"Class文件格式",实际上它完全不需要以磁 ...

随机推荐

  1. flush();close();dispose()

    写一个写csv文件的程序,用streamwriter,觉得程序主体是没有问题的,但是一直写不进去,最后发现是因为没有调用flush(). msdn 对streamwriter.flush()的的说明是 ...

  2. easyUI的datagrid控件日期列不能正确显示Json格式数据的解决方案

    EasyUI是一套比较轻巧易用的Jquery控件,在使用过程中遇到一个问题,它的列表控件——datagrid, 在显示日期列的时候,由于后台返回给页面的数据是Json格式的,其中的日期字段,在后台是正 ...

  3. .net 网站发布 Web.Config中的<compilation debug="true"/>

    Web.Config中的<compilation debug="true"/> <compilation debug="true"/> ...

  4. asp.net 如何改变GridView搜索出来关键字的颜色?就像百度似的,我获得的是一个集合,改变集合中关键字的集合

    输入“产量”查询,将“产量”拆分,产.量 string strColNameCnDt = string.Empty;            for (int j = 0; j < dtTemp. ...

  5. org.hibernate.service.jndi.JndiException: Error parsing JNDI name []

    我的hibernate.cfg.xml文件如下: <?xml version="1.0" encoding="UTF-8"?> <!DOCTY ...

  6. C# ITextSharp pdf 自动打印

    PDF生成后直接进入打印预览不用下载 using iTextSharp.text; using iTextSharp.text.pdf; Document pdfDoc = new Document( ...

  7. Jquery各版本下载,附Jquery官网下载方法

    jQuery version 2.1.1 http://ajax.aspnetcdn.com/ajax/jQuery/jquery-2.1.1.js http://ajax.aspnetcdn.com ...

  8. Python 学习日记(第二周)

    从这周开始我就正式学习Python 语言了.以后每周都会有一篇有关于学习Python的见闻与大家分享! Python的安装 学习的第一步首先要有一个运行的环境.所以接下来介绍一下安装的步骤. 通过Py ...

  9. Constructing Roads--hdu1102

    Constructing Roads Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  10. 让WordPress的作者在后台只能看到自己的文章

    今天需要对WordPress后台进行调整,目的是为了只能让当前用户看见自己所发表的文章,而WordPress默认是登陆用户可以看到所有用户发表的文章. WordPress中的用户角色分的比较详细,作者 ...