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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏编程

Python基础2字符串

String 字符串是Python中最常用的数据类型,可以用单引号和双引号创建字 符串,字符串是不可变的。 字符串的基本操作:Python内建序列包括(列表、元...

20890
来自专栏抠抠空间

python内置函数大全

 数学运算 abs:求数值的绝对值 >>> abs(-2) 2 divmod:返回两个数值的商和余数 >>> divmod(5,2) (2, 1) >> d...

29460
来自专栏程序员互动联盟

【Java概念学习】--数组的初始化

一维数组的声明方式: type var[]; 或type[] var; 声明数组时不能指定其长度(数组中元素的个数), Java中使用关键字new创建数组对象,...

344110
来自专栏xx_Cc的学习总结专栏

C - 指针C语言指针的总结

54280
来自专栏水击三千

JavaScript函数(二)

在前面我们已经对函数作了简单的介绍,比如函数的定义、函数的声明、函数的调用和函数的传参等。本节将进一步介绍函数的应用,深度理解函数的各种使用。 函数是一个对象,...

29070
来自专栏Pythonista

Python中的变量引用对象需注意的几点

        Python中,变量的作用仅仅是一个标识,只有赋值后才被创建,它可以引用任何类型的对象,而且在引用之前必须赋值。赋值后的变量指向响应的对象,拥有...

13220
来自专栏liukaili_666888999

Swift变量 常量

11320
来自专栏逸鹏说道

深入浅出JavaScript之原型链&继承

阅读目录 小试身手 基于原型的继承 prototype属性与原型 实现一个class继承另外一个class 改变prototype 实现继承的方式 Javasc...

42980
来自专栏代码世界

Python之函数进阶

一、命名空间 命名空间一共分为三种:   全局命名空间   局部命名空间   内置命名空间 全局命名空间:代码在运行伊始,创建的存储“变量名与值的关系”的空间 ...

34660
来自专栏Python小屋

Python获取numpy数组中最大的5个元素(保持原顺序)

本文主要演示numpy的argsort()函数的用法。这个函数的返回值是数组中的元素排序后的原下标,例如np.argsort([3,1,2])的返回结果是arr...

37960

扫码关注云+社区

领取腾讯云代金券