zoukankan      html  css  js  c++  java
  • 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差不多,能用小的权限,就不要用大的

  • 相关阅读:
    解决ActiveX插件ZIndex属性无效问题
    XNA游戏开发之字符篇
    XNA游戏开发之滚动背景
    ExtJs之FormPanel篇
    独立Discuz头像编辑模块
    XNA游戏开发之2D游戏
    WPF系列之应用程序生命周期
    DiscuzX2.0在windows下的配置
    Silverlight之out of Browser模式
    使用VisualStudio2010连接CodePlex进行代码管理
  • 原文地址:https://www.cnblogs.com/qq1207501666/p/6699680.html
Copyright © 2011-2022 走看看