(10)python 特殊方法
一、构造方法
在类中定义构造函数
>>> class a:
def __init__(self):
self.age=42 >>> f=a()
>>> f.age
42
>>>
带参数,构造函数
>>> class b:
def __init__(self,name):
self.name1=name >>> f=b('tom')
>>> f.name1
'tom'
>>>
重写一般方法
略
重写构造方法
当子类调用父类的方法时,b类重写的构造函数没有name属性,会导致报错
定义两个类 a,b
>>> class a:
def __init__(self):
self.age=18
def age1(self):
print self.age >>> class b(a):
def __init__(self):
self.name='tom'
def name1(self):
print self.name
调用a类的age1()方法
>>> f=a()
>>> f.age1()
18
没问题
调用b类的name1()方法
>>> n=b()
>>> n.name1()
tom
没问题
但当调用b类的从a类继承的age1方法时

因为构造方法被重写,b类没有age属性。所以报错了
解决办法:使用super()函数
在子类的构造函数开头加上一行 : super(本类名,self).__init__()
>>> __metaclass__=type #python2.7 新式类才能用super
>>> class a:
def __init__(self):
self.age=18
def age1(self):
print self.age >>> class b(a):
def __init__(self):
super(b,self).__init__()
self.name='tom'
def name1(self):
print self.name >>>
再运行
>>> m=b()
>>> m.age1()
18
>>>
得到了想要的结果
二、成员访问
序列和映射规则
类中特殊方法:
__len__ (self)
返回对象中所含项目的数量,对于序列来说是返回元素的个数,对于字典来说返回的是键值对的个数
>>> names=['tom','jack','li']
>>> class Name:
def __init__(self,n):
self.name=n
def __len__(self):
return len(self.name) >>> f=Name(names)
>>> print len(f) >>>
__getitem__ (self,key)
返回输入键对应的值,对于序列键就是正整数(1,2,3),对于字典键就是key
传序列
>>> letter=['a','b','c']
>>> class Letter:
def __init__(self,l):
self.dict=l
def __getitem__(self,key):
return self.dict[key] >>> f=Letter(letter)
>>> f[]
'a'
>>> f[]
'b'
传字典
>>> stu={'':'tom','':'jack','':'li'}
>>> class Student:
def __init__(self,s):
self.dict=s
def __getitem__(self,code):
return self.dict[code]
>>> f=Student(stu)
>>> f['']
'jack'
>>>
__setitem__ (self,key,value)
当获取到值后,可以修改或者新增元素。(像类似保存了元组那样不能被修改的对象,不能使用此方法)
>>> stu={'':'tom','':'jack','':'li'}
>>> class Student:
def __init__(self,s):
self.dict=s
def __setitem__(self,code,name):
self.dict[code]=name
def __getitem__(self,code):
return self.dict[code]
>>> f=Student(stu)
>>> stu
{'': 'tom', '': 'li', '': 'jack'}
>>> f['']='hanmeimei'
>>> stu
{'': 'tom', '': 'li', '': 'jack', '': 'hanmeimei'}
>>>
__delitem__(self,key)
此方法在对对象使用del时被调用,同时会删除键和值。
拿上面的例子加个__delitem__(self,key)方法
>>> stu={'':'tom','':'jack','':'li'}
>>> class Student:
def __init__(self,s):
self.dict=s
def __getitem__(self,code):
return self.dict[code]
def __delitem__(self,code):
del self.dict[code]
>>> f=Student(stu)
>>> stu
{'': 'tom', '': 'li', '': 'jack'}
>>> f['']
'jack'
>>> del f['']
>>> stu
{'': 'tom', '': 'li'}
>>>
如果不写__delitem__(self,key)试图删一个元素,会报错

三、属性
1、 property
通过访问器定义的特性称为属性
s=property(a,b,c,d)
s称为属性,a,b,c,d是property()方法的参数。
a,b,c是方法,d是文档字符串。 c,d是可选参数。
当获取s属性里的值时,会调用a方法。当给s属性赋值时,会调用b方法。删除s属性调用c方法。
调用property方法前提是要使用新式类
2、装饰器
?
3、__getattr__,__setattr__
?
四、迭代器
五、生成器
六、八皇后问题
python 执行顺序
从上往下顺序执行,定义的方法和类要写在调用之前,
如果有 if __name__ == '__main__' 改方法所在的文件作为启动文件时会被调用,如果作为模块被调用时不会被执行。

(10)python 特殊方法的更多相关文章
- Python中list常用的10个基本方法----list的灰魔法
########################list 的常用的10个基本方法################################## list 类 列表# 1 列表的基本格式#2 可以 ...
- python字符串方法的简单使用
学习python字符串方法的使用,对书中列举的每种方法都做一个试用,将结果记录,方便以后查询. (1) s.capitalize() ;功能:返回字符串的的副本,并将首字母大写.使用如下: >& ...
- Python str方法总结
1.返回第一个字母大写 S.capitalize(...) S.capitalize() -> string 1 2 3 4 >>>a = 'shaw' >>> ...
- Python 魔术方法指南
入门 构造和初始化 构造定制类 用于比较的魔术方法 用于数值处理的魔术方法 表现你的类 控制属性访问 创建定制序列 反射 可以调用的对象 会话管理器 创建描述器对象 持久化对象 总结 附录 介绍 此教 ...
- Python魔法方法总结及注意事项
1.何为魔法方法: Python中,一定要区分开函数和方法的含义: 1.函数:类外部定义的,跟类没有直接关系的:形式: def func(*argv): 2.方法:class内部定义的函数(对象的方法 ...
- #10 Python字符串
前言 通过上一节可知,Python6个序列的内置类型中,最常见的是列表和元组,但在Python中,最常用的数据类型却不是列表和元组,而是字符串.要想深入了解字符串,必须先掌握字符编码问题.因此本篇博文 ...
- #8 Python数学方法
前言 前几节了解了Python的不同数据类型,有小伙伴会问,不同的数据类型之间是否可以相互转换?肯定是可以的,本篇博文主要记录数字类型的转换,其他类型的相互转换会在下几节记录,Here we go! ...
- Python String 方法详解
官网文档地址:https://docs.python.org/3/library/stdtypes.html#string-methods 官网 公号:软测小生ruancexiaosheng 文档里的 ...
- Python index()方法
Python index()方法 Python 字符串 描述 Python index() 方法检测字符串中是否包含子字符串 str ,如果指定 beg(开始) 和 end(结束) 范围,则检查是否 ...
随机推荐
- QueryHelper插件类(hql)
package cn.itcast.core.util; import java.util.ArrayList; import java.util.List; public class QueryHe ...
- BZOJ 3668:起床困难综合症(贪心)
分析:按位贪心即可. program sleep; var a,g:..]of longint; n,i,m,ans,t,len,x,y,v:longint; c:char; s:string; e: ...
- 如何让旧浏览器支持HTML5新标签
HTML5出现也不短了,很多网站的页面都进行了改版,为了降低代码量(不需要起太多的类名),提升加载速度,提高标签的语义性,因此,在网页中大量使用了section,article,header等HTML ...
- 【BZOJ 3772】精神污染 主席树+欧拉序
这道题的内存…………………真·精神污染……….. 这道题的思路很明了,我们就是要找每一个路径包含了多少其他路径那么就是找,有多少路径的左右端点都在这条路径上,对于每一条路径,我们随便选定一个端点作为第 ...
- vector 进阶
http://classfoo.com/ccby/article/jnevK #include <iostream> #include <vector> #include &l ...
- 什么是node.js的事件驱动编程
Node.js现在非常活跃,相关生态社区已经超过Lua(基本上比较知名的功能都有nodejs模块实现).但是我们为何要使用Node.Js?相比传统的webserver服务模式,nodejs有什么优点优 ...
- [bzoj 2733]启发式合并权值线段树
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2733 平衡树待学习.从一个博客学到了合并权值线段树的姿势:http://blog.csdn ...
- js 内置对象属性及方法
1.Date 属性(1): constructor 所建立对象的函数参考 prototype 能够为对象加入的属性和方法 方法(43): getDay() 返回一周 ...
- Spring 4 + Hibernate 4 下 getCurrentSession()的使用情况
前言:1 getCurrentSession创建的session会和绑定到当前线程,而openSession不会. 2 getCurrentSession创建的线程会在事务回滚或事物提交后自动关闭 ...
- nginx重要配置项简要说明
1.重要配置项 以下是一个完整的nginx配置信息. #================================以下是全局配置项 #指定运行nginx的用户和用户组,默认情况下该选项关闭(关闭 ...