zoukankan      html  css  js  c++  java
  • Python中的类、对象、继承

    Python中,类的命名使用帕斯卡命名方式,即首字母大写。

    Python中定义类的方式如下:

    class 类名([父类名[,父类名[,...]]]):
        pass

    省略父类名表示该类直接继承自object,类的实例化如下:

    class Person():
        def __init__(self):
            pass
    
    person=Person()

    __init__()是类的构造函数,在实例化时调用,它的参数self表示类实例。

    类中的字段

    字段的访问级别:

    • Python中以双下划线开头的字段访问级别是private;
    • Python中以下划线开头的字段访问级别是protected;
    • Python中未以下划线开头的字段的访问级别是public;

    上述访问级别更多的是一种编程约定,即便是以双下划线开头的字段,在类的外部也是可以访问的,但不建议这么做。示例代码如下:

    class Person():
        age = 24
        _name = 'person'
        __family_name = 'securate'
    
        def __init__(self):
            print('Person init')

     Person类成员:


     


    在上图中,我们可以看到类中并没有出现一双下划线开头的字段__family_name,而多出一个_Person__family_name。说明类实例不可以直接访问__family_name,但可以通过实例名._Person__family_name的方式来访问。

    上述三种类型的变量均可以通过类或类实例进行访问。通过self定义的变量只能通过类实例进行访问,如self.country,变量country只能通过类实例进行访问。

    类中的方法

    Python中方法名均为小写字母,不同单词间以下划线进行分割。

    方法的覆盖

    Python类中没有方法的重载,对于具有相同名称的方法,后面的定义会覆盖掉前面的定义;子类会覆盖父类中同名的方法。在Person类中定义两个同名方法say

        def say(self, message):
            print(message)
        def say(self, info):
            print('second: '+info)
    
    
    person=Person()
    person.say('invoke')

     程序执行结果:


     

    从程序运行结果可知,调用的是定义在后面的say(self, info)方法。

    特殊方法

    以双下划线开头和结尾的方法属于特殊方法,如:__init__(self)__call__(self)等内置方法。在我们自己定义方法时不建议采取这种方式。

    方法的访问级别
    • Python中以双下划线开头的方法访问级别是private;
    • Python中以下划线开头的方法访问级别是protected;
    • Python中未以下划线开头的方法的访问级别是public;

    和字段类似,上述访问级别也只是一种编程约定,即便是以双下划线开头的方法,在类的外部也是可以访问的,但不建议这么做。

    实例方法

    定义方法时,没有装饰器修饰且带有参数的(可以不是self),即为实例方法。
    类外部通过类实例来调用,类内部通过self.方法名来调用。

    def method(self):
        pass
    @classmethod

    @classmethod是Python中的装饰器
    使用@classmethod修饰的方法,必须要带参数(默认参数名是cls),该参数表示类自身。可以通过类自身或者类实例调用@classmethod修饰的方法。在@classmethod修饰的方法中无法访问实例成员,但可以通过cls或者类名访问类中的字段。

    @staticmethod

    使用@staticmethod修饰的方法可以没有参数,可以通过类或者类实例调用。在@staticmethod修饰的方法中,无法访问类中的实例成员,可以通过类名访问类中的字段。

    继承

    定义一个Chinese类,继承自Person类:

    class Chinese(Person):
        def __init__(self):
            pass
    
    chinese=Chinese()

     Chinese中的字段:


     


    从Chinese类型的实例中,我们可以看到Chinese类继承了除country之外的所有字段。
    子类还会继承父类中的函数,若子类没有实现自己的构造函数(__init__(self)),那么在实例化子类时会调用父类的构造函数。

    子类间的类型转换

    class Person():
        def __init__(self):
            pass
        def convert(self, class_type):
            if issubclass(class_type, Person):
                return (class_type)(self)
    
    class Chinese(Person):
        def __init__(self, convert=None):
            pass
        def cn_method(self):
            print('chinese')
    
    
    class Japanese(Person):
        def __init__(self, convert=None):
            pass

    执行类型转换:

    jap = Japanese()
    cn = jap.convert(Chinese)
    cn.cn_method()

     类型转换结果如下图:

    可以看到,根据Japanese实例得到了Chinese类型实例。这里的转换只是获取了Chinese类型的实例cn,而原有的Japanese类型实例依然存在于内存中。

    程序执行结果如下图:


     

    推荐阅读

    Python风格规范
    Python进阶

    参考文章:

    飘逸的python - @staticmethod和@classmethod的作用与区别
    Difference between @staticmethod and @classmethod in Python

     

  • 相关阅读:
    Feign性能优化注意事项--超时
    Android MVP+Retrofit+dagger2+RxAndroid框架整合
    Android adb命令,linux中各种命令
    【视频音频】雷霄骅开源视音频项目汇总
    Android LitePal介绍与使用说明
    AndroidStudio第一次提交项目代码到git服务器/github
    Android框架之路——Fragmentation的使用(流式交互Demo)
    Android Studio 升级到3.0后出现编译错误.gradlecaches ransforms-1files-1.1*****-release.aar
    Android Studio你必须学会的快捷键(Eclipse转AS必看)
    Intellij IDEA常用配置详解
  • 原文地址:https://www.cnblogs.com/Cwj-XFH/p/6027687.html
Copyright © 2011-2022 走看看