python3类的继承详解_基于python3 类的属性、方法、封装、继承详解

下面小编就为大家带来一篇基于python3 类的属性、方法、封装、继承实例讲解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

Python 类

Python中的类提供了面向对象编程的所有基本功能:类的继承机制允许多个基类,派生类可以覆盖基类中的任何方法,方法中可以调用基类中的同名方法。

对象可以包含任意数量和类型的数据。

python类与c++类相似,提供了类的封装,继承、多继承,构造函数、析构函数。

在python3中,所有类最顶层父类都是object类,与java类似,如果定义类的时候没有写出父类,则object类就是其直接父类。

类定义

类定义语法格式如下:

class ClassName:

.

.

.

类对象:创建一个类之后,可以通过类名访问、改变其属性、方法

实例对象:类实例化后,可以使用其属性,可以动态的为实例对象添加属性(类似javascript)而不影响类对象。

类的属性

可以使用点(.)来访问对象的属性

也可以使用以下函数的方式来访问属性:

getattr(obj, name[, default]) : 访问对象的属性

hasattr(obj,name) : 检查是否存在一个属性

setattr(obj,name,value) : 设置一个属性。如果属性不存在,会创建一个新属性

delattr(obj, name) : 删除属性

Python内置类属性

__dict__ : 类的属性(包含一个字典,由类的数据属性组成)

__doc__ :类的文档字符串

__name__: 类名

__module__: 类定义所在的模块(类的全名是'__main__.className',如果类位于一个导入模块mymod中,那么className.__module__ 等于 mymod)

__bases__ : 类的所有父类构成元素(包含了以个由所有父类组成的元组)

class Person:

"Person类"

def __init__(self, name, age, gender):

print('进入Person的初始化')

self.name = name

self.age = age

self.gender = gender

print('离开Person的初始化')

def getName(self):

print(self.name)

p = Person('ice', 18, '男')

print(p.name) # ice

print(p.age) # 18

print(p.gender) # 男

print(hasattr(p, 'weight')) # False

# 为p添加weight属性

p.weight = '70kg'

print(hasattr(p, 'weight')) # True

print(getattr(p, 'name')) # ice

print(p.__dict__) # {'age': 18, 'gender': '男', 'name': 'ice'}

print(Person.__name__) # Person

print(Person.__doc__) # Person类

print(Person.__dict__) # {'__doc__': 'Person类', '__weakref__': , '__init__': , 'getName': , '__dict__': , '__module__': '__main__'}

print(Person.__mro__) # (, )

print(Person.__bases__) # (,)

print(Person.__module__) # __main__

类的方法

在类地内部,使用def关键字可以为类定义一个方法,与一般函数定义不同,类方法必须包含参数self,且为第一个参数。

类的专有方法:

__init__ 构造函数,在生成对象时调用

__del__ 析构函数,释放对象时使用

__repr__ 打印,转换

__setitem__按照索引赋值

__getitem__按照索引获取值

__len__获得长度

__cmp__比较运算

__call__函数调用

__add__加运算

__sub__减运算

__mul__乘运算

__p__除运算

__mod__求余运算

__pow__称方

__init__()方法是一种特殊的方法,被称为类的构造函数或初始化方法,当创建了这个类的实例时就会调用该方法,与c++中构造函数类似。只需在自定义的类中重写__init__()方法即可。

class Person:

def __init__(self, name, age, gender):

print('进入Person的初始化')

self.name = name

self.age = age

self.gender = gender

print('离开Person的初始化')

def getName(self):

print(self.name)

# Person实例对象

p = Person('ice', 18, '男')

print(p.name)

print(p.age)

print(p.gender)

p.getName()

# 进入Person的初始化

# 离开Person的初始化

# ice

# 18

# 男

# ice

析构函数 __del__ ,__del__在对象消逝的时候被调用,当对象不再被使用时,__del__方法运行:

方法

实例方法:只能通过实例调用,实例方法第一个定义的参数只能是实例本身引用

class Myclass:

def foo(self):

print(id(self),'foo')

a=Myclass()#既然是实例对象,那就要创建实例

a.foo()#输出类里的函数地址

print(id(a))#输出类对象的地址

#结果地址一样

类方法:定义类方法,要使用装饰器@classmethod,定义的第一个参数是能是类对象的引用,可以通过类或者实例直用

class Myclass:

@classmethod#类装饰器

def foo2(cls):

print(id(cls),'foo2')

#类对象,直接可以调用,不需要实例化

print(id(Myclass),'yy')

Myclass.foo2()#直接可以调用

静态方法:定义静态方法使用装饰器@staticmethod,没有默认的必须参数,通过类和实例直接调用

class Myclass:

@staticmethod#静态方法

def foo3():

print('foo3')

Myclass.foo3()#没有参数

a.foo3()

#结果foo3

类的封装

python通过变量名命名来区分属性和方法的访问权限,默认权限相当于c++和java中的public

类的私有属性: __private_attrs:两个下划线开头,声明该属性为私有,不能在类地外部被使用或直接访问。在类内部的方法中使用时self.__private_attrs。

类的私有方法:__private_method:两个下划线开头,声明该方法为私有方法,不能在类地外部调用。在类的内部调用 self.__private_methods

虽然python不允许实例化的类访问私有数据,但可以使用 object._className__attrName 访问属性。其实python内部私有化的实现只是将attrName属性变为了_className__attrName而已

class Demo:

__id = 123456

def getId(self):

return self.__id

temp = Demo()

# print(temp.__id) # 报错 AttributeError: 'Demo' object has no attribute '__id'

print(temp.getId()) # 123456

print(temp._Demo__id) # 123456

类的继承

面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制。继承完全可以理解成类之间的类型和子类型关系。

需要注意的地方:继承语法 class 派生类名(基类名)://... 基类名写作括号里,基本类是在类定义的时候,在元组之中指明的。

在python中继承中的一些特点:

1:在继承中基类的构造(__init__()方法)不会被自动调用,它需要在其派生类的构造中亲自专门调用。使用super().__init__()或parentClassName.__init__()

2:在调用基类的方法时,需要加上基类的类名前缀,且需要带上self参数变量。区别于在类中调用普通函数时并不需要带上self参数

3:Python总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到基类中逐个查找。(先在本类中查找调用的方法,找不到才去基类中找)。

如果在继承元组中列了一个以上的类,那么它就被称作"多重继承" 。

语法:

派生类的声明,与他们的父类类似,继承的基类列表跟在类名之后。

多态

如果父类方法的功能不能满足需求,可以在子类重写父类的方法。实例对象调用方法时会调用其对应子类的重写后的方法

python3.3 类与继承 小例

hon中的类提供了面向对象编程的所有基本功能:类的继承机制允许多个基类,派生类可以覆盖基类中的任何方法,方法中可以调用基类中的同名方法。

class Base:

def __init__(self):

self.data=[]

def add(self,x):

self.data.append(x)

def addtwice(self,x):

self.add(x)

self.add(x)

# child extends base

class Child(Base):

def plus(self,a,b):

return a+b

oChild=Child()

oChild.add("str1")

oChild.add(999)

oChild.addtwice(4)

print(oChild.data)

print(oChild.plus(2,3))

对象可以包含任意数量和类型的数据。

python类与c++类相似,提供了类的封装,继承、多继承,构造函数、析构函数。

在python3中,所有类最顶层父类都是object类,与java类似,如果定义类的时候没有写出父类,则object类就是其直接父类。

类定义

类定义语法格式如下:

class ClassName:

.

.

.

类对象:创建一个类之后,可以通过类名访问、改变其属性、方法

实例对象:类实例化后,可以使用其属性,可以动态的为实例对象添加属性(类似javascript)而不影响类对象。

类的属性

可以使用点(.)来访问对象的属性

也可以使用以下函数的方式来访问属性:

getattr(obj, name[, default]) : 访问对象的属性

hasattr(obj,name) : 检查是否存在一个属性

setattr(obj,name,value) : 设置一个属性。如果属性不存在,会创建一个新属性

delattr(obj, name) : 删除属性

Python内置类属性

__dict__ : 类的属性(包含一个字典,由类的数据属性组成)

__doc__ :类的文档字符串

__name__: 类名

__module__: 类定义所在的模块(类的全名是'__main__.className',如果类位于一个导入模块mymod中,那么className.__module__ 等于 mymod)

__bases__ : 类的所有父类构成元素(包含了以个由所有父类组成的元组)

class Person:

"Person类"

def __init__(self, name, age, gender):

print('进入Person的初始化')

self.name = name

self.age = age

self.gender = gender

print('离开Person的初始化')

def getName(self):

print(self.name)

p = Person('ice', 18, '男')

print(p.name) # ice

print(p.age) # 18

print(p.gender) # 男

print(hasattr(p, 'weight')) # False

# 为p添加weight属性

p.weight = '70kg'

print(hasattr(p, 'weight')) # True

print(getattr(p, 'name')) # ice

print(p.__dict__) # {'age': 18, 'gender': '男', 'name': 'ice'}

print(Person.__name__) # Person

print(Person.__doc__) # Person类

print(Person.__dict__) # {'__doc__': 'Person类', '__weakref__': , '__init__': , 'getName': , '__dict__': , '__module__': '__main__'}

print(Person.__mro__) # (, )

print(Person.__bases__) # (,)

print(Person.__module__) # __main__

类的方法

在类地内部,使用def关键字可以为类定义一个方法,与一般函数定义不同,类方法必须包含参数self,且为第一个参数。

类的专有方法:

__init__ 构造函数,在生成对象时调用

__del__ 析构函数,释放对象时使用

__repr__ 打印,转换

__setitem__按照索引赋值

__getitem__按照索引获取值

__len__获得长度

__cmp__比较运算

__call__函数调用

__add__加运算

__sub__减运算

__mul__乘运算

__p__除运算

__mod__求余运算

__pow__称方

__init__()方法是一种特殊的方法,被称为类的构造函数或初始化方法,当创建了这个类的实例时就会调用该方法,与c++中构造函数类似。只需在自定义的类中重写__init__()方法即可。

class Person:

def __init__(self, name, age, gender):

print('进入Person的初始化')

self.name = name

self.age = age

self.gender = gender

print('离开Person的初始化')

def getName(self):

print(self.name)

# Person实例对象

p = Person('ice', 18, '男')

print(p.name)

print(p.age)

print(p.gender)

p.getName()

# 进入Person的初始化

# 离开Person的初始化

# ice

# 18

# 男

# ice

析构函数 __del__ ,__del__在对象消逝的时候被调用,当对象不再被使用时,__del__方法运行:

类的封装

python通过变量名命名来区分属性和方法的访问权限,默认权限相当于c++和java中的public

类的私有属性: __private_attrs:两个下划线开头,声明该属性为私有,不能在类地外部被使用或直接访问。在类内部的方法中使用时self.__private_attrs。

类的私有方法:__private_method:两个下划线开头,声明该方法为私有方法,不能在类地外部调用。在类的内部调用 self.__private_methods

虽然python不允许实例化的类访问私有数据,但可以使用 object._className__attrName 访问属性。其实python内部私有化的实现只是将attrName属性变为了_className__attrName而已

class Demo:

__id = 123456

def getId(self):

return self.__id

temp = Demo()

# print(temp.__id) # 报错 AttributeError: 'Demo' object has no attribute '__id'

print(temp.getId()) # 123456

print(temp._Demo__id) # 123456

类的继承

面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制。继承完全可以理解成类之间的类型和子类型关系。

需要注意的地方:继承语法 class 派生类名(基类名)://... 基类名写作括号里,基本类是在类定义的时候,在元组之中指明的。

在python中继承中的一些特点:

1:在继承中基类的构造(__init__()方法)不会被自动调用,它需要在其派生类的构造中亲自专门调用。使用super().__init__()或parentClassName.__init__()

2:在调用基类的方法时,需要加上基类的类名前缀,且需要带上self参数变量。区别于在类中调用普通函数时并不需要带上self参数

3:Python总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到基类中逐个查找。(先在本类中查找调用的方法,找不到才去基类中找)。

如果在继承元组中列了一个以上的类,那么它就被称作"多重继承" 。

语法:

派生类的声明,与他们的父类类似,继承的基类列表跟在类名之后。

多态

如果父类方法的功能不能满足需求,可以在子类重写父类的方法。实例对象调用方法时会调用其对应子类的重写后的方法

python3.3 类与继承 小例

class Base:

def __init__(self):

self.data=[]

def add(self,x):

self.data.append(x)

def addtwice(self,x):

self.add(x)

self.add(x)

# child extends base

class Child(Base):

def plus(self,a,b):

return a+b

oChild=Child()

oChild.add("str1")

oChild.add(999)

oChild.addtwice(4)

print(oChild.data)

print(oChild.plus(2,3))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/529004.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux本地mysql与服务器同步数据_linux下指定mysql数据库服务器主从同步的配置实例...

一、 概念:① 数据库同步 (主从同步 --- 主数据库写的同时 往从服务器写数据)② 数据库同步 (主主同步 --- 两台数据库服务器互相写数据)二、 举例数据库服务器(A) 主数据库 IP:192.168.1.134数据库服务器(B) 主数据库 IP:192.168.1.13…

c#二叉树 取叶子节点个数_两种类似但是原理不同的算法求二叉树的所有叶子节点和...

技术提高是一个循序渐进的过程,所以我讲的leetcode算法题从最简单的level开始写的,然后到中级难度,最后到hard难度全部完。目前我选择C语言,Python和Java作为实现语言,因为这三种语言还是比较典型的。由于篇幅和精力有…

所有的service报红但不报错_从一个应用报错来看centos系统的/tmp目录自动清理规则...

概述分享最近应用碰到的一个奇怪bug,一开始以为是代码上的问题,找了一段时间发现居然是因为系统的一个自动清理规则导致,下面一起来看看吧~一、应用报错:logwire.core.exceptions.GeneralUnhandledException: 服务端未处理异常...…

python对浏览器的常用操作_Selenium元素的常用操作方法分析

本文实例讲述了Selenium元素的常用操作方法。分享给大家供大家参考,具体如下:Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozill…

springboot中接口实例化_AngularJs中控制器的定义,实例化,作用域范围

AngularJs中控制器的定义,实例化,作用域范围基于AngularJS入门与进阶(江荣波 著)这本书的笔记AngularJS 1.x的demoAngularJS1.x和Angular2,4,5是不一样的两个东西,构建方式,语法,都很多不同AngularJs控制器定义与实例化…

高斯核函数参数确定_高斯过程

之前看过高斯过程(GP),不过当时也没太看懂,最近花时间认真研究了一下,感觉总算是明白咋回事了,本文基于回归问题解释GP模型的思想和方法。文中的想法是自己思考总结得来,并不一定准确,也可能存在错误性。为…

uniapp光标自动定义到文本框_特检自动化行吊静力检测方案

主要测量功能使用徕卡测量开发的Windows版数据传输软件,通过蓝牙连接徕卡DISTO,经过简单的测量周期设置,即可实现自动化的距离检测。测量数据还可以输出Excel,甚至可以实时发送至PC运行的第三方软件中,这么强大的软件还…

安装python时需要勾选_一体化污水处理设备安装时需要注意事项

一体化污水处理设备用于处理生活污水和低浓度有机污水,它基本上采用机电完全封闭的结构,不需要专业人员进行管理。它方便且易于清洁,因此引起了很多关注。一体化污水处理设备的安装方法通常为三种:地埋式,地上式和半地…

oracle驱动maven报错_在Maven仓库中添加Oracle JDBC驱动

由于Oracle授权问题,Maven3不提供Oracle JDBC driver,为了在Maven项目中应用Oracle JDBC driver,必须手动添加到本地仓库。一.首先要得到Oracle JDBC Driver2.通过Oracle的安装目录获得,位置在“{ORACLE_HOME}jdbclibojdbc14.jar”二.手动安装…

python3.6程序_python3.6如何生成exe程序

PyInstaller的原理简介PyInstaller其实就是把python解析器和你自己的脚本打包成一个可执行的文件,和编译成真正的机器码完全是两回事,所以千万不要指望成打包成一个可执行文件会提高运行效率,相反可能会降低运行效率,好处就是在运…

java切片_ java中一个极其强悍的新特性Stream详解(非常实用)

java8中有两个非常有名的改进,一个是Lambda表达式,一个是Stream。如果我们了解过函数式编程的话,都知道Stream真正把函数式编程的风格引入到了java中。这篇文章由简入繁逐步介绍Stream。一、Stream是什么从名字来看,Stream就是一个…

java获取网络图片_有了这50套Java毕设项目(源码 案例),offer拿到手软,无偿分享...

简介:又到了开学季,不少人都很是烦恼,手把手教你做Java毕设项目,有教程视频源码100套随意选择,试试手!!列举其中2个系统大纲在线考试系统1.综述网络考试系统的项目背景及国内外发展现状&#xf…

python字典的建立和输出_字典的创建和使用

直接创建d {age: 23, name: Daniel, sex: 1}输出结果:{age: 23, name: Daniel, sex: 1}dict函数# 通过序列对建立字典vaulues [(name, Daniel), (age, 23), (sex, 1)]print dict(values)# 通过关键字建立字典print dict(nameDaniel, age23, sex1)# 如果 dict 不传…

python字符串出栈方法_1.Python实现字符串反转的几种方法

1.Python实现字符串反转的几种方法题目: 在Python环境下用尽可能多的方法反转字符串,例如将s "abcdef"反转成 "fedcba"第一种:使用字符串切片result s[::-1]第二种:使用列表的reverse方法l list(s)l.reverse()result …

linux将日期和日历信息追加到文件中_Linux常用指令

常用指令 1、帮助指令 man [指令或者配置文件] help 指令 2、文件目录类指令 1、pwd 功能:显示当前工作目录的绝对路径 2、ls [选项] [目录或者文件] 功能:列出文件名和目录使用:ls -l 以列表的形式显示信息ls -a …

python播放音乐同步歌词_使用Python下载歌词并嵌入歌曲文件中的实现代码

使用python扫描本地音乐并下载歌词这次这个真的是干货哦,昨晚弄了半晚上,,,,从8点吃完饭就开始写,一直到了快12点才弄好,,,新手,伤不起呀。。。。先简单的说下…

ajax mysql点赞_php+mysql结合Ajax实现点赞功能完整实例

phpmysql结合Ajax实现点赞功能完整实例131415161718192021222324252627282930313233343536//判断是否已经存在了cookiefunction checkcookie(gindex){var thiscookie goodplus gindex;var mapcookie getCookie(thiscookie)if (mapcookie!null && mapcookie!"&q…

一个搜索框多个按钮_网站搜索栏设计指南:要不要?怎么设计?

在网站的设计过程中,搜索栏是一个很容易被忽略的部分,但用户却依赖它来寻找特定的信息。由于搜索栏是网站中最常用的元素之一,所以搜索栏的设计对用户体验有着重要的影响。网站是否需要搜索栏?搜索栏使用背后的思维和心理是帮助用…

mysql的使用优化问题吗_如何对 mysql 进行优化的问题

3641 天前mingszu-------------------------------------------------------------------------------------------------------------------------------------------------------------------| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Ca…

通过 xlsx 解析上传excel的数据

一、前言 在前端开发中,特别是在后台管理系统中,导入数据(上传excel)到后端是是否常见的功能;而一般的实现方式都是通过接口将excel上传到后端,再有后端进行数据解析并做后续操作。 今天,来记录…