python 面向对象oop

1 oop 对象世界观  -- oop是目前人类认知最接近实际生活的语言

  • 一切事务皆对象
  • 对象有运动规律和内部状态
  • 对象之间能够相互调用

2.面向对象

  • 惟一性:对象具备惟一性,不存在两个相同的对象,除非他们是同一个对象
  • 能够分类性 : 对象能够分类

3.oop 分类

  • 封装
  • 继承
  • 多态

具体类:

结构python

  classs 类名:函数

    类体oop

  • 建立对象使用类名(__init__ 函数除第一个参数外的参数列表)
  • 建立对象的时候 实际执行了 __init__函数, __init__ 并不会建立对象,但会初始化对象
  • 当使用对象来调用方法的时候,第一个参数会自动的传入(默认是self,这个self这四个字母能够替换成任意字符,但位置必须是第一个)

做用域

  • 类的直接下级做用域 叫作类变量
  • 关联到实例的变量 叫作实例变量

例子:this

1 class E:
2     NAME = 'E' # 类的直接下级做用域 叫作类变量
3     
4     def __init__(self, name):
5         self.name = name  # 关联到实例的变量 叫作实例变量
  • 类变量对类和实例均可见
  • 全部实例共享类变量
  • Python 可动态的给对象增减属性,当给实例的类变量赋值时,至关于动态的给这个实例增长了一个属性,覆盖了类变量

 

属性的查找顺序

  • __dict__  :当经过对象动态增长属性的时候,若是存在此属性,会覆盖原属性,不存在会存放到对象.__dict__中。spa

  • __class__ : 若是经过类名.类属性方式给类属性从新赋值,原类属性会被覆盖代理

  --------------------------------------------------- 只须要对象.__dict__ 来看其内容能分辨-----------------------------------------------------------------------------  code

类装饰器一般用于给类增长属性-- 方法都是类级的对象

类方法/静态方法

方法的定义都是类级的,可是有的方法使用实例调用,有的方法使用类来调用blog

class I:
    def print(self):
        print('instance method')
    
    @classmethod  # 当一个方法,被classmethod装饰的时候, 第一个参数会变成类自己, 这样的方法叫类方法
    def class_print(cls):
        print(id(cls))
        print('class method')
    
    @staticmethod # 当一个方法, 被staticmethod装饰的时候,不会自动传递第一个参数, 这样的方法叫静态方法
    def static_print():
        print('static method')
        
    def xxx_print():
        print('this is a function')

实例方法只能由实例调用继承

类方法:类方法能够被实例使用,而且被实例使用时,传入的第一个参数仍是类

访问控制

 

class Door:
    def __init__(self, number, status):
        self.number = number
        self.__status = status  # 双下划线开始, 非双下划綫结尾的都是私有的, 在类外部没法访问
    
    def open(self): # 方法
        self.__status = 'opening'
        
    def close(self):
        self.__status = 'closed'
    
    def status(self):
        return self.__status
    
    def __set_number(self, number): # 双下滑先开始, 非双下划线结尾的方法也是私有方法
        self.number = number

全部双下划线开始,非双下划线结尾的成员,都是私有成员

私有成员在类外部没法访问

Python的私有成员是经过更名实现的,_类名 + 带双下划綫的属性 在__dict__ 中会有标识(python中没有真正的私有成员,但这能够忽略不计)

部分代码中 用单下划线标注的变量能够理解为内部变量,不但愿在外部继续调用(其实外部能够调用),解释器不不作任何处理

双下划线开始,非双下划线结尾的方法是私有方法。

若是用 @property  装饰器会把一个仅有self参数的函数,变成一个属性, 属性的值,为方法的返回值

class Door:
    def __init__(self, status):
        self.__status = status  # 双下划线开始, 非双下划綫结尾的都是私有的, 在类外部没法访问
       
    @property    # property 装饰器会把一个仅有self参数的函数,变成一个属性, 属性的值,为方法的返回值
    def status(self):
        return self.__status
d = Door('opening')
print(d.status) status 为 Door 中 status方法

类的继承

  • 在类名后加括号 括号中是继承列表, 称之为父类或者基类或者超类- python中不建议多继承
  • 继承一个明显的好处就是能够获取父类的属性和方法,深层次继承会比较乱
  • 凡是公有的都能继承
  • 凡是私有的都不能继承
  • 原来是什么,继承过来仍是什么
  • 当子类和父类有同名成员的时候, 子类的成员会覆盖父类的同名成员
  • super(父类, self).print() # 代理 TYPE 的父类的方法, 而且使用 obj 绑定 第一个参数 指定调用谁的直接父类, 第二个参数指定当调用时,传递什么做为方法的第一个参数

  • 当父类含有一个带参数的初始化方法的时候,子类必定须要一个初始化方法,而且在初始化方法中调用父类的初始化方法
    class Base:
        def __init__(self, a, b):
            self.__a = a
            self.__b = b
        
        def sum(self):
            return self.__a + self.__b
    class Sub(Base):
        def __init__(self, a, b, c):
            self.c = c
    #         self.__a = a
    #         self.__b = b
            super().__init__(a, b)
  • super 对象只能获取类的属性

相关文章
相关标签/搜索