(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)
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__

?

 

四、迭代器

 

 

五、生成器

 

六、八皇后问题

 

 

 python 执行顺序

从上往下顺序执行,定义的方法和类要写在调用之前,

如果有 if __name__ == '__main__'   改方法所在的文件作为启动文件时会被调用,如果作为模块被调用时不会被执行。

 

posted @ 2019-02-01 14:56  富坚老贼  阅读(237)  评论(0编辑  收藏  举报