前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python中的类、对象、继承

Python中的类、对象、继承

作者头像
雪飞鸿
发布2018-09-05 10:40:59
2.2K0
发布2018-09-05 10:40:59
举报
文章被收录于专栏:me的随笔me的随笔

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

Python中定义类的方式如下:

代码语言:javascript
复制
class 类名([父类名[,父类名[,...]]]):
    pass

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

代码语言:javascript
复制
class Person():
    def __init__(self):
        pass

person=Person()

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

类中的字段

字段的访问级别:

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

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

代码语言:javascript
复制
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

代码语言:javascript
复制
    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.方法名来调用。

代码语言:javascript
复制
def method(self):
    pass
@classmethod

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

@staticmethod

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

继承

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

代码语言:javascript
复制
class Chinese(Person):
    def __init__(self):
        pass

chinese=Chinese()

 Chinese中的字段:

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

子类间的类型转换

代码语言:javascript
复制
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

执行类型转换:

代码语言:javascript
复制
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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-11-03 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 类中的字段
  • 类中的方法
    • 方法的覆盖
      • 特殊方法
        • 方法的访问级别
          • 实例方法
            • @classmethod
              • @staticmethod
              • 继承
              • 子类间的类型转换
              • 推荐阅读
              • 参考文章:
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档