Python中的类、对象、继承

时间:2022-01-19 21:44:43

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类成员:

Python中的类、对象、继承
 

在上图中,我们可以看到类中并没有出现一双下划线开头的字段__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')

程序执行结果:

Python中的类、对象、继承
 

从程序运行结果可知,调用的是定义在后面的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中的字段:

Python中的类、对象、继承
 

从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()

类型转换结果如下图:

Python中的类、对象、继承

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

程序执行结果如下图:

Python中的类、对象、继承
 

推荐阅读

Python风格规范
Python进阶

参考文章:

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

 

Python中的类、对象、继承的更多相关文章

  1. 关于Python中的类普通继承与super函数继承

    关于Python中的类普通继承与super函数继承 1.super只能用于新式类 2.多重继承super可以保公共父类仅被执行一次 一.首先看下普通继承的写法 二.再看看super继承的写法 参考链接 ...

  2. 全面了解python中的类,对象,方法,属性

    全面了解python中的类,对象,方法,属性 python中一切皆为对象,所谓对象:我自己就是一个对象,我玩的电脑就是对象,坐着的椅子就是对象,家里养的小狗也是一个对象...... 我们通过描述属性( ...

  3. python中的类与继承

    Class 类的定义以及实例的建立 Python中,类通过 class 关键字定义. 例如最简单的一个类定义可以为: class Person(object): pass Python 的编程习惯,类 ...

  4. python中自定义类对象json字符串化的方法

    1. 用 json 或者simplejson 就可以 2.定义转换函数: def convert_to_builtin_type(obj): print 'default(', repr(obj), ...

  5. 理解Python中的类对象、实例对象、属性、方法

    class Animal(object): # 类对象 age = 0 # 公有类属性 __like = None # 私有类属性 def __init__(self): # 魔法方法 self.na ...

  6. Python 中的类的继承

    class parent(object): def override1(self): print("Parent") class child(parent): def overri ...

  7. GO-结构体(类似python中的类)

    一.结构体有名属性 package main import "fmt" func main(){ type Sb struct { name string //属性名,数据类型 a ...

  8. python中的类和实例

    今天花了两个多小时后搜索相关博客看了看python中有关类和实例的介绍,差不多大概明白了. python中的类和c++中的类是一样的,不同之处就是c++的类,如果含有成员变量,并且成员变量发生变化后, ...

  9. python中的类机制

    一.python中的对象 1.python中对象种类及关系 <type 'type'>:该对象可以成为其他类的类型,python中几乎所有对象都是直接或间接由<type 'type' ...

随机推荐

  1. 【分享】图解Windows Server 2012 R2 配置IIS 8全过程

    最近计划更换服务器,包括IIS服务器与数据库服务器,操作系统都是Windows Server 2012 R2,第一次接触Windows Server 2012,感觉比较新鲜,一路摸索完成了IIS 8 ...

  2. 将序列化成json格式的日期(毫秒数)转成日期格式

    <script> $(function () { loadInfo(); }) function loadInfo() { $.post("InfoList.ashx" ...

  3. 【Android Studio】Android Studio 安装及设置

    版权所有, 禁止转载, 如有需要, 请站内联系. 本文地址: http://blog.csdn.net/caroline_wendy/article/details/20845807 时间: 2014 ...

  4. Asp&period;net中向前端输出JS的一些调用

    最近突然写ASP.NET项目,用到向前台输出JS脚本,但是以前在MVC里是通过异步或者一些方法来调用,但是ASP.net用到的很少.在网上找到一个HELPER.CS.保存一下,以后再用. using ...

  5. 多个微信小程序一个服务端架构

    由于某些特定的业务场景,当多个小程序需要一个服务端后台提供数据时,大家可能想到是HTTP路由.是的,实际上我们使用微服务的GateWay网关也是一样的,如下图微服务架构: 网关GateWay的作用在于 ...

  6. 使用 Nginx 为 Linux 实例绑定多个域名

    KB: 41467 · 更新时间:2018-11-16 20:26:51     Nginx 是一款广泛应用的 Web 服务器,常用于反向代理.负载均衡器以及 HTTP 缓存等.本文以 CentOS ...

  7. Salesforce的基础用户界面定制

    Salesforce的用户界面 Salesforce的用户界面易于定制.本文将讲述如何定制: 主菜单和选项卡 自定义按钮和链接 视图列表 页面布局 定制主菜单和选项卡 Salesforce的主菜单默认 ...

  8. JVM系列三&colon;JVM参数设置

    JVM系列三:JVM参数设置.分析   不管是YGC还是Full GC,GC过程中都会对导致程序运行中中断,正确的选择不同的GC策略,调整JVM.GC的参数,可以极大的减少由于GC工作,而导致的程序运 ...

  9. pandas时间序列分析和处理Timeseries

    pandas最基本的时间序列类型就是以时间戳(TimeStamp)为index元素的Series类型. 生成日期范围: pd.date_range()可用于生成指定长度的DatetimeIndex.参 ...

  10. 【转】ssh timed out 超时解决方案

    转自:http://www.cnblogs.com/niutouzdq/p/4091268.html 在使用阿里云ECS服务器的时候,winsftp经常被服务器断开,想必是过一会没有操作,防火墙喜欢对 ...