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 - @staticmethod和@classmethod的作用与区别
Difference between @staticmethod and @classmethod in Python
Python中的类、对象、继承的更多相关文章
- 关于Python中的类普通继承与super函数继承
关于Python中的类普通继承与super函数继承 1.super只能用于新式类 2.多重继承super可以保公共父类仅被执行一次 一.首先看下普通继承的写法 二.再看看super继承的写法 参考链接 ...
- 全面了解python中的类,对象,方法,属性
全面了解python中的类,对象,方法,属性 python中一切皆为对象,所谓对象:我自己就是一个对象,我玩的电脑就是对象,坐着的椅子就是对象,家里养的小狗也是一个对象...... 我们通过描述属性( ...
- python中的类与继承
Class 类的定义以及实例的建立 Python中,类通过 class 关键字定义. 例如最简单的一个类定义可以为: class Person(object): pass Python 的编程习惯,类 ...
- python中自定义类对象json字符串化的方法
1. 用 json 或者simplejson 就可以 2.定义转换函数: def convert_to_builtin_type(obj): print 'default(', repr(obj), ...
- 理解Python中的类对象、实例对象、属性、方法
class Animal(object): # 类对象 age = 0 # 公有类属性 __like = None # 私有类属性 def __init__(self): # 魔法方法 self.na ...
- Python 中的类的继承
class parent(object): def override1(self): print("Parent") class child(parent): def overri ...
- GO-结构体(类似python中的类)
一.结构体有名属性 package main import "fmt" func main(){ type Sb struct { name string //属性名,数据类型 a ...
- python中的类和实例
今天花了两个多小时后搜索相关博客看了看python中有关类和实例的介绍,差不多大概明白了. python中的类和c++中的类是一样的,不同之处就是c++的类,如果含有成员变量,并且成员变量发生变化后, ...
- python中的类机制
一.python中的对象 1.python中对象种类及关系 <type 'type'>:该对象可以成为其他类的类型,python中几乎所有对象都是直接或间接由<type 'type' ...
随机推荐
- Hyper-V无法文件拖拽解决方案~~~这次用一个取巧的方法架设一个FTP来访问某个磁盘,并方便的读写文件
异常处理汇总-服 务 器 http://www.cnblogs.com/dunitian/p/4522983.html 服务器相关的知识点:http://www.cnblogs.com/dunitia ...
- [APUE]标准IO库(下)
一.标准IO的效率 对比以下四个程序的用户CPU.系统CPU与时钟时间对比 程序1:系统IO 程序2:标准IO getc版本 程序3:标准IO fgets版本 结果: [注:该表截取自APUE,上表中 ...
- C#多线程之线程同步篇3
在上一篇C#多线程之线程同步篇2中,我们主要学习了AutoResetEvent构造.ManualResetEventSlim构造和CountdownEvent构造,在这一篇中,我们将学习Barrier ...
- node中的Stream-Readable和Writeable解读
在node中,只要涉及到文件IO的场景一般都会涉及到一个类-Stream.Stream是对IO设备的抽象表示,其在JAVA中也有涉及,主要体现在四个类-InputStream.Reader.Outpu ...
- java中的内部类总结
内部类不是很好理解,但说白了其实也就是一个类中还包含着另外一个类 如同一个人是由大脑.肢体.器官等身体结果组成,而内部类相当于其中的某个器官之一,例如心脏:它也有自己的属性和行为(血液.跳动) 显然, ...
- IIS启动失败,启动Windows Process Activation Service时,出现错误13:数据无效 ;HTTP 错误 401.2 - Unauthorized 由于身份验证头无效,您无权查看此页
因为修改过管理员账号的密码后重启服务器导致IIS无法启动,出现已下异常 1.解决:"启动Windows Process Activation Service时,出现错误13:数据无效&quo ...
- HTML5 摇一摇加强版之一次失败的探索
最近在看设备传感器的API,当然也少不了研究一下让微信称神的“摇一摇”了.关于“摇一摇”的实现,网上很多资料所以不详细说了,但总是有布局.效果不全等各种问题,所以作为一名资深copypaster,代码 ...
- 【完全开源】知乎日报UWP版:项目结构说明、关键源代码解释
目录 说明 项目结构 关键代码 演示视频 说明 上一篇博客将源码放出来了,但是并没有做过多的介绍,所以如果自己硬看可能需要花费很长的时间,尤其这些代码并不是自己写的.项目不算复杂但是也不算简单,这篇文 ...
- 使用CSS3的box-shadow实现双透明遮罩层对话框
box-shadow介绍 在我之前的一篇文章<从天猫和支付宝身上学习opcity与rgba>中,介绍了实现双透明遮罩层效果的两种方法,分别是opacity和rgba.他们需要分别依赖于不同 ...
- Entity Framework 6 Recipes 2nd Edition(10-7)译 -> TPH继承模型中使用存储过程
10-7. TPH继承模型中使用存储过程 问题 用一个存储过程来填充TPH继承模型的实体 解决方案 假设已有如Figure 10-7所示模型. 我们有两个派生实体: Instructor(教员)和St ...