一、构造方法

在类中定义构造函数

>>> 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 特殊方法的更多相关文章

  1. Python中list常用的10个基本方法----list的灰魔法

    ########################list 的常用的10个基本方法################################## list 类 列表# 1 列表的基本格式#2 可以 ...

  2. python字符串方法的简单使用

    学习python字符串方法的使用,对书中列举的每种方法都做一个试用,将结果记录,方便以后查询. (1) s.capitalize() ;功能:返回字符串的的副本,并将首字母大写.使用如下: >& ...

  3. Python str方法总结

    1.返回第一个字母大写 S.capitalize(...) S.capitalize() -> string 1 2 3 4 >>>a = 'shaw' >>> ...

  4. Python 魔术方法指南

    入门 构造和初始化 构造定制类 用于比较的魔术方法 用于数值处理的魔术方法 表现你的类 控制属性访问 创建定制序列 反射 可以调用的对象 会话管理器 创建描述器对象 持久化对象 总结 附录 介绍 此教 ...

  5. Python魔法方法总结及注意事项

    1.何为魔法方法: Python中,一定要区分开函数和方法的含义: 1.函数:类外部定义的,跟类没有直接关系的:形式: def func(*argv): 2.方法:class内部定义的函数(对象的方法 ...

  6. #10 Python字符串

    前言 通过上一节可知,Python6个序列的内置类型中,最常见的是列表和元组,但在Python中,最常用的数据类型却不是列表和元组,而是字符串.要想深入了解字符串,必须先掌握字符编码问题.因此本篇博文 ...

  7. #8 Python数学方法

    前言 前几节了解了Python的不同数据类型,有小伙伴会问,不同的数据类型之间是否可以相互转换?肯定是可以的,本篇博文主要记录数字类型的转换,其他类型的相互转换会在下几节记录,Here we go! ...

  8. Python String 方法详解

    官网文档地址:https://docs.python.org/3/library/stdtypes.html#string-methods 官网 公号:软测小生ruancexiaosheng 文档里的 ...

  9. Python index()方法

    Python index()方法  Python 字符串 描述 Python index() 方法检测字符串中是否包含子字符串 str ,如果指定 beg(开始) 和 end(结束) 范围,则检查是否 ...

随机推荐

  1. require.js 模块化

    什么是模块化? 将若干功能进行封装,以备将来被重复使用. 为什么要前端模块化? 将公共功能进行封装实现复用 灵活解决依赖 解决全局变量污染 如何实现前端模块化? <!DOCTYPE html&g ...

  2. JVM内存区域配置

    堆内存:新域+旧域 设置堆内存初始化大小 java -Xms128m 设置堆内存初始化大小128MB 设置堆内存最大大小 java -Xmx256m 设置堆内存最大256MB 通常将堆内存的初始化大小 ...

  3. Hibernate关联映射之_多对一

    多对一 Employee-Department 对于 员工 和 部门 两个对象,从员工的角度来看,就是多对一的一个关系--->多个员工对应一个部门 表设计: 部门表:department,id主 ...

  4. [51nod1503]猪和回文 DP

    ---题面--- 题解: 首先观察到题目要求的是合法回文串的个数,而回文串要求从前往后和从后往前是一样的,因此我们假设有两只猪,分别从左上和右下开始走,走相同的步数最后相遇,那么它们走的路能拼在一起构 ...

  5. 【CF edu 30 D. Merge Sort】

    time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standa ...

  6. 【可持久化线段树?!】rope史上最全详解

    https://www.luogu.org/problemnew/show/P3919 看到上面链接中的题时,我在学会可持久化线段树的同时,第一次学会了一个非常屌(cai)的STL大法——rope!! ...

  7. 牛客多校对抗第6场 A Singing Contest

    [20分]标题:A.Singing Contest | 时间限制:1秒 | 内存限制:256MJigglypuff is holding a singing contest. There are 2n ...

  8. oracle的sequece的使用(主键自增长)

    在Oracle数据库中,sequence等同于序列号,每次取的时候sequence会自动增加,一般会作用于需要按序列号排序的地方. 1.Create Sequence (注释:你需要有CREATE S ...

  9. 开发中常遇到的Python陷阱和注意点

    最近使用Python的过程中遇到了一些坑,例如用datetime.datetime.now()这个可变对象作为函数的默认参数,模块循环依赖等等. 在此记录一下,方便以后查询和补充. 避免可变对象作为默 ...

  10. SpringMVC学习 -- 使用 @RequestMapping 映射请求

    在控制器的类定义及方法出定义出都可以标注 @RequestMapping: 类定义处:提供初步的请求映射信息.相对于 Web 应用的根目录. 方法定义出:提供进一步的细分映射信息.相对于类定义处的 U ...