码迷,mamicode.com
首页 > 其他好文 > 详细

(10)特殊方法

时间:2019-02-01 15:51:49      阅读:132      评论:0      收藏:0      [点我收藏+]

标签:alt   let   int   修改   字典   通过   解决   strong   正整数   

一、构造方法

在类中定义构造函数

>>> 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)
3
>>> 

 

 __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[0]
a
>>> f[1]
b

 传字典

>>> stu={1:tom,2:jack,3:li}
>>> class Student:
    def __init__(self,s):
        self.dict=s
    def __getitem__(self,code):
        return self.dict[code]

    
>>> f=Student(stu)
>>> f[2]
jack
>>> 

 

 

  __setitem__ (self,key,value) 

 当获取到值后,可以修改或者新增元素。(像类似保存了元组那样不能被修改的对象,不能使用此方法)

>>> stu={1:tom,2:jack,3: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
{1: tom, 3: li, 2: jack}
>>> f[4]=hanmeimei
>>> stu
{1: tom, 3: li, 2: jack, 4: hanmeimei}
>>> 

 

 

 __delitem__(self,key)

此方法在对对象使用del时被调用,同时会删除键和值。

拿上面的例子加个__delitem__(self,key)方法

>>> stu={1:tom,2:jack,3: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
{1: tom, 3: li, 2: jack}
>>> f[2]
jack
>>> del f[2]
>>> stu
{1: tom, 3: 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__

?

 

四、迭代器

 

 

五、生成器

 

六、八皇后问题

 

(10)特殊方法

标签:alt   let   int   修改   字典   通过   解决   strong   正整数   

原文地址:https://www.cnblogs.com/buchizaodian/p/7016496.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!