Python中的类、对象、继承

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

Python中定义类的方式以下:git

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

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

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

person=Person()

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

类中的字段

字段的访问级别:函数

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

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

class Person():
    age = 24
    _name = 'person'
    __family_name = 'securate'

    def __init__(self):
        print('Person init')

 Person类成员:google


 


在上图中,咱们能够看到类中并无出现一双下划线开头的字段__family_name,而多出一个_Person__family_name。说明类实例不能够直接访问__family_name,但能够经过实例名._Person__family_name的方式来访问。spa

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

类中的方法

 

Python中方法名均为小写字母,不一样单词间如下划线进行分割。3d

方法的覆盖

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

相关文章
相关标签/搜索