zoukankan      html  css  js  c++  java
  • (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__'   改方法所在的文件作为启动文件时会被调用,如果作为模块被调用时不会被执行。

  • 相关阅读:
    Nginx配置文件详解
    ngrinder 负载均衡脚本开发
    spring boot过滤器FilterRegistrationBean
    Spring boot 拦截器和过滤器
    spring controller中默认转发、forward转发、redirect转发之间的区别
    @RestControllerAdvice作用及原理
    Android APK脱壳--腾讯乐固、360加固一键脱壳
    java 简单xor加密
    facebook 研究
    阿里云docker安装
  • 原文地址:https://www.cnblogs.com/buchizaodian/p/7016496.html
Copyright © 2011-2022 走看看