Python3-面向对象

面向对象是一中编程思想,具有 封装、继承、多态三大特性

  Python从一开始设计就是面向对象的,并且结构上支持OOP,但Python并不会强制你写面向对象的代码,面向对象是一中概念性的东西,讲的是Everything is object,通过面向对象思想写出来的程序具有更好的扩展性,这个东西需要通过不断的编程,进行经验的积累,才能进行深入理解

Python中的类

  Python2.x默认都是经典类,只有显式继承了object才是新式类

  Python3.x默认都是新式类,废除了经典类

  注:

    新式类与经典类最大的区别就是继承搜索顺序的不同:

      新式类(广度优先)

      经典类(深度优先)

类的一些特殊属性

  __dict__

    类的属性(包含一个字典,由类的数据属性组成)
  __doc__

    类的文档字符串
  __name__

    类名
  __module__

    类定义所在的模块
  __bases__

    类的所有父类构成元素(包含了一个由父类组成的元组)

类的一些特殊方法

  __init__(self[, *args])

    构造方法 简单的调用obj = ClassName(args)
  __del__(self)

    析构方法 简单的调用del obj
  __repr__(self)

    转化为供解释器读取的形式 简单的调用repr(obj)
  __str__(self)

    用于将值转化为适于人阅读的形式 简单的调用str(obj)
  __cmp__(self, x)

    对象比较 简单的调用cmp(obj,x)

class MyClass(object):
    """
        类的文档字符串
    """
    attr = "类的属性"
    _protected_attr = "类的受保护属性"
    __private_attr = "类的私有属性"

    def __init__(self, name):
        """
        构造方法
        """
        self.name = name    # 实例属性
        pass

    @property
    def private_attr(self):
        """
        把方法变成属性,多用于访问私有变量 getter
        :return:
        """
        return self.__private_attr

    @private_attr.setter
    def private_attr(self, value):
        """
        通过方法设置属性值 setter
        :return:
        """
        self.__private_attr = value

    def common_method(self):
        """
        实例方法,和实例有关系的方法
        推荐只调用实例变量
        :return:
        """
        print(self.name)

    @classmethod
    def class_method(cls):
        """
        类方法,只和类有关系的方法
        推荐只调用类变量
        :return:
        """
        print(cls)

    @staticmethod
    def static_method():
        """
        静态方法,和类、实例都没有关系,只是属于这个类而已
        不能调用类变量和实例变量
        多为一些与类或实例有关的工具方法而已
        :return:
        """
        pass
View Code

封装

  封装隐藏类的实现细节,避免用户通过不规范的操作来存取封装的数据属性

继承

  继承最主要的功能是代码的复用,Python支持多继承,所有类的顶级父类是object

  注:

    1.在继承中基类的构造方法__init__()不会被自动调用,需要在子类中手动调用
    2.新式类的继承查找顺序是广度优先,经典类的继承查找顺序是深度优先
    3.Python支持"多重继承"

class Father:
    def talk(self):
        print("I'm Laowang, My name is %s" % self.name)


class LaoWang:
    def __init__(self, name):
        print("This is LaoWang")
        self.name = name   # 实例变量属于实例,不属于类

    def papapa(self):
        print("Pa pa pa...")


class Child(Father, LaoWang):
    def __init__(self):
        # super()代表他所有的父类,当调用__init__方法的时候,它会先找Father,Father中没有,在找的Laowang
        # 查找算法叫做MRO,即广度优先
        super().__init__("Jet")
        super().papapa()

# 实例化
child = Child()
child.talk()
View Code

多态

  Python不支持多态,换句话说,Python本身就是"多态"的,因为它是弱类型语言,对象的类型由Python解释器自识别转换

反射

  通过"字符串"操作"类"的成员,Python中主要提供了4个内置函数来实现反射

  hasattr(obj, "attr_name")

  getattr(obj, "attr_name")

  delattr(obj, "attr_name")

  setattr(obj, "attr_name", value)

关于访问修饰符

  Python中没有类似于Java中的private、protected、public这样的特定关键字,是使用特殊写法来进行区分的
  1.private[Java]: __xxx
    这样的属性与方法就相当于私有的,不能类外部直接访问
  2.protected[Java]: _xxx
    这样的属性与方法就相当于受保护的,但是按照约定俗成的规定,是可以被类外部直接访问的
    但是,当你看到这样的变量时,意思是"虽然我可以被访问,但是请把我视为私有变量,不要随意访问"
  3.public[Java]: xxx
    默认的,不带下划线的,都属于公共的,可以随意访问
  注意:
    1.类似于__xxx__这样写法的属性和方法是特殊变量,特殊变量是可以直接访问的,不是private变量,Python保留的命名
    2.Python的私有变量__xxx是不是一定不能从外部访问呢?其实也不是,我们可以通过这样的方式来进行访问
      实例对象._类名__xxx
      但是,强烈不建议你这么干,因为不同版本的Python解释器可能会把xxx改成不同的变量名
      总的来说,Python本身没有任何机制阻止你干坏事,一些全靠自觉
    3.访问权限的规则和Java差不多,能用小的权限,就不要用大的

原文地址:https://www.cnblogs.com/qq1207501666/p/6699680.html