• python 类与对象解析


    类成员:
        # 字段
            - 普通字段,保存在对象中,执行只能通过对象访问
            - 静态字段,保存在类中,  执行 可以通过对象访问 也可以通过类访问
           
        # 方法
            - 普通方法,保存在类中,由对象来调用,self=》对象
            - 静态方法,保存在类中,由类直接调用,对象也可以调用
            -   类方法,保存在类中,由类直接调用,cls=》当前类,对象也可以调用

    class Foo:
        nation = 'china'# 静态字段
        def __init__(self, name):
            self.name = name  # 普通字段
        
        def show(self):   # 普通方法
            print(self.name)
    
        @staticmethod   # 静态方法
        def stat(a1,a2):
            print(a1,a2)
    
        @classmethod    # 类方法
        def classmd(cls):# cls 是类名
            print(cls)
            print('classmd')
    
    obj = Foo('pis')
    obj.name
    obj.show()
    #Foo.show(obj)#也能成功调用,传入对象参数 Foo.stat(
    1,2)#类直接调用 Foo.classmd()#类直接调用
    obj.stat(1,2) #对象直接调用
    obj.classmd()#对象直接调用

    python并没有真正的私有属性(c++有public protect private)

            实际上:用__定义的属性,只是被改名换姓而已。

           用_定义的属性,意义在于唤起用户的注意,看成私有属性.实际上只是普通方法。

            表现形式:双下划线的函数或属性,在类定义中(类中方法)可以调用和访问,类的实例不可以直接访问,子类不可访问。

                              单下划线的函数或属性,在类定义中(类中方法)可以调用和访问,类的实例可以直接访问,子类中可以访问;

            对于双下划线的函数或属性,Python解释器使用了名字混淆的方法, 将私有的方法"__method"变成了"_classname__method"了。

    class Base(object):#object 为基类,有一些常用的方法
        def __private(self):
            print("private value in Base")
    
        def _Base__private(self):
            print("_Base__private value in Base")#如果没有定义,则调用上一方法
    
        def _protected(self):  #已被覆盖
            print("protected value in Base")
    
        def public(self):
            print("public value in Base")
            self.__private()
    """此时调用父类的方法-----------原因如下:
        self.__private()方法调用时先从子类寻找,再从父类寻找,没有则报错。
        如果是子类的普通方法调用,虽然子类的私有方法已改名,但能识别,而调用子类的私有方法。
        现在父类的public调用,而子类的私有方法已改名,不能识别。
        父类的public方法只能寻找并调用父类的__private()方法。
        我们知道子类的普通方法能够调用子类的私有方法(虽然已改名),父类也是。所以能够找到父类的私有方法。
        那么父类的私有方法改名了吗?我们加入代码测试------已改
    """
            self._protected()#已被覆盖
    
    class Derived(Base):
        def __private(self):
            print("override private")
    
        def _protected(self):
            print("override protected")
    
    d = Derived() #创建对象
    d.public() #继承父类的方法
    d._protected()#调用子类的方法
    d._Derived__private()#调用子类__private(),不推荐使用。不符合初衷。
    
    #d.__private()#已改名,不能调用。父类就算有相同方法根本看不到。

    结果如下:

    public value in Base
    _Base__private value in Base
    override protected
    override protected
    override private

    python 继承

    1. 多重继承时方法查找顺序如何呢?

           类都有一个名为 __mro__ 的属性, 它的值是一个元组, 按照方法解析顺序列出各个超类, 从当前类一直向上, 直到object 类。 D 类的 __mro__ 属性如下 :

    (<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)

    通俗点也就是三大原则:a. 左侧优先
                                            b. 一条道走到黑
                                            c. 同一个根时,根最后执行

    2. 单继承和多继承中构造函数__init__

        单继承情况

        (1)子类默认无__init__时,则会直接继承父类__init__

        (2)子类中含有__init__时,不会自动调用父类__init__,如需使用父类__init__中的变量,则需要在子类__init__中显式调用

         多继承情况
        (1)子类继承于多个父类,并且子类无__init__时,则按继承顺序(MRO),哪个父类在最前面且有自己的__init__,则继承它;若最前面的父类无__init__,则继承第二个父类的__init__,若还是无__init__,则依次往后寻找,直到继承的某个父类含__init__。

        (2)子类继承于多个父类,并且子类含__init__时,和单继承的(2)类似,不会自动调用所有父类__init__,如需使用某个父类__init__中的变量,则需要在子类__init__中显式调用

  • 相关阅读:
    js的alert乱码问题
    (6)select语句
    (5)视图
    (4)索引
    (3)操作数据库
    (2)MySQL数据类型
    (1)MySQL概述
    RocketMQ安装使用
    uniapp打包h5
    面试必问 如何保证缓存与数据库的一致性
  • 原文地址:https://www.cnblogs.com/MY0213/p/7821766.html
Copyright © 2020-2023  润新知