Python object

 面向对象:http://www.cnblogs.com/wupeiqi/p/4766801.html

    class 类关键字

    class index(继承):

        def __init__(self,name,age):

            self.name = name

            self.age = age

           

python 支持多继承

    深度优先,广度优先

    当类是经典类时,按照深度优先的方式查找

    当类是新式类时,按照广度优先的方式查找(新式类,当前类或父类是继承object类)

 

                   |--普通字段->属于类(country = '中国')

            |--字段|

            |      |--静态字段->属于对象(self.name = name)

            |

            |       |-普通方法->至少一个self

------类对象|--方法 |-类方法 -->@classmethod

            |       |-静态方法->@staticmethod

            |

            |      

            |--属性|--普通属性->@property(定义时,在普通方法的基础上添加 @property 装饰器;

                                          定义时,属性仅有一个self参数

                                          调用时,无需括号foo_obj.prop)伪造成字段的方法叫属性

            新式类,有三种属性访问方式:

                obj.price          # 自动执行 @property 修饰的 price 方法,并获取方法的返回值

                obj.price = 123    # 自动执行 @price.setter 修饰的 price 方法,并将  123 赋值给方法的参数

                del obj.price      # 自动执行 @price.deleter 修饰的 price 方法

            使用静态字段的方法:BAR = property(get_bar)

            静态字段的方法,经典类和新式类没有区别

            print(obj.BAR)#自动调用get_bar的方法,并获取返回值

            BAR = property(get_bar, set_bar, del_bar, 'description...')

                obj = Foo()

                obj.BAR              # 自动调用第一个参数中定义的方法:get_bar

                obj.BAR = "alex"     # 自动调用第二个参数中定义的方法:set_bar方法,并将“alex”当作参数传入

                del Foo.BAR          # 自动调用第三个参数中定义的方法:del_bar方法

                obj.BAE.__doc__      # 自动获取第四个参数中设置的值:description...

            !所以,定义属性共有两种方式,分别是【装饰器】和【静态字段】,而【装饰器】方式针对经典类和新式类又有所不同   

            

              私有方法&私有字段:

              __init__:私有方法,self.__foo='私有字段'

             

              普通字段-公有普通字段:对象可以访问;类内部可以访问;派生类中可以访问

                -私有普通字段:仅类内部可以访问;

               类的特殊成员:

                1.__doc__:表示类的描述信息

                2.__module__ :表示当前操作的对象在哪一个模块

                  __class__ : 表示当前操作的对象的类是什么

                3.__init__:创建类的时候自动调用

                4.__del__:虚构方法,当前对象在内存中被释放是,自动执行

                5.__call__: 对象后面加括号,触发执行.

                6.__dict__: cls.__dict__ : 获取类的静态字段和方法

                            obj.__dict__ : 获取obj的成员

                7.__str__: 如果一个类中定义了__str__方法,那么在打印 对象 时,默认输出该方法的返回值.

                8.__getitem__、__setitem__、__delitem__用于索引操作,以上表示获取,设置,删除数据,obj['name'], obj['age']=18, del obj['city']

                 result = obj['k1']      # 自动触发执行 __getitem__

                 obj['k2'] = 'wupeiqi'   # 自动触发执行 __setitem__

                 del obj['k1']           # 自动触发执行 __delitem__  

                9.__getslice__、__setslice__、__delslice__ :该三个方法用于分片操作

                obj[-1:1]                   # 自动触发执行 __getslice__

                obj[0:1] = [11,22,33,44]    # 自动触发执行 __setslice__

                del obj[0:2]                # 自动触发执行 __delslice__

                10.iter:obj = iter([11,22,33,44])

                          for i in obj:

                           print i

    

 

组合:

    在一个类中以另外一个类的对象作为数据属性,称之为类的组合

    class BirthDate: class Course: class Professor:

        p1 = Professor('egon','male',

                        BirthDate('1995','1','27'),

                        Course('python',1800,'4 months'))

     p1.birth.months == 1

               

其他相关

    isinstance(obj,Foo):检查obj是否是类Foo的对象

    issubclass(sub,super):检查sub是否super的子类(派生类)

   

异常基本类型:

    AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x

    IOError 输入/输出异常;基本上是无法打开文件

    ImportError 无法引入模块或包;基本上是路径问题或名称错误

    IndentationError 语法错误(的子类) ;代码没有正确对齐

    IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]

    KeyError 试图访问字典里不存在的键

    KeyboardInterrupt Ctrl+C被按下

    NameError 使用一个还未被赋予对象的变量

    SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)

    TypeError 传入对象类型与要求的不符合

    UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,

    导致你以为正在访问它

    ValueError 传入一个调用者不期望的值,即使值的类型是正确的

               

interface:接口

    from abc import ABCMeta,abstractmethod

    class Payment(metaclass=ABCMeta):

        @abstractmethod

        def pay(self,money):

            pass

    class Wechatpay(Payment):

        def fuqian(self,money):

            print('微信支付了%s元'%money)

 

    p = Wechatpay() #不调就报错了

    子类必须重写父类的方法

 

classmethod 类方法,staticmethod 静态方法 (Foo.func() 不需要实例化)

    相同:都可以直接被类调用,不需要实例化

    不同:

        类方法必须有一个cls参数表示这个类,可以使用类属性

        静态方法不需要,静态方法不能直接使用

               

    普通方法  默认有一个self对象传进来,并且只能被对象调用——绑定到对象

    类方法    默认有一个cls传进来表示本类,并且可以被类和对象(不推荐)调用——绑定到类

    静态方法  没有默认参数,并且可以被类和对象(不推荐)调用——非绑定               

   

posted @ 2018-05-02 15:52  mihon  阅读(6)  评论(0)    收藏  举报