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

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

Python 类

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

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

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

立即学习“Python免费学习笔记(深入)”;

在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) # iceprint(p.age) # 18print(p.gender) # 男print(hasattr(p, 'weight')) # False# 为p添加weight属性p.weight = '70kg'print(hasattr(p, 'weight')) # Trueprint(getattr(p, 'name')) # iceprint(p.__dict__) # {'age': 18, 'gender': '男', 'name': 'ice'}print(Person.__name__) # Personprint(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.__idtemp = Demo()# print(temp.__id) # 报错 AttributeError: 'Demo' object has no attribute '__id'print(temp.getId()) # 123456print(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 baseclass Child(Base):  def plus(self,a,b):    return a+boChild=Child()oChild.add("str1")oChild.add(999)oChild.addtwice(4)print(oChild.data)print(oChild.plus(2,3))

登录后复制

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

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

立即学习“Python免费学习笔记(深入)”;

在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) # iceprint(p.age) # 18print(p.gender) # 男print(hasattr(p, 'weight')) # False# 为p添加weight属性p.weight = '70kg'print(hasattr(p, 'weight')) # Trueprint(getattr(p, 'name')) # iceprint(p.__dict__) # {'age': 18, 'gender': '男', 'name': 'ice'}print(Person.__name__) # Personprint(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.__idtemp = Demo()# print(temp.__id) # 报错 AttributeError: 'Demo' object has no attribute '__id'print(temp.getId()) # 123456print(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 baseclass Child(Base):def plus(self,a,b):return a+boChild=Child()oChild.add("str1")oChild.add(999)oChild.addtwice(4)print(oChild.data)print(oChild.plus(2,3))

登录后复制

以上就是基于python3 类的属性、方法、封装、继承详解的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2266259.html

(0)
上一篇 2025年2月27日 09:13:35
下一篇 2025年2月24日 08:26:59

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • Python3 基础爬虫简介

    python3 基础爬虫入门心得 第一次写博客,有点紧张,不喜勿喷。 如果有不足之处,希望读者指出,本人一定改正。 学习爬虫之前你需要了解(个人建议,铁头娃可以无视):- **少许网页制作知识,起码要明白什么标签…**- **相关语言基…

    2025年2月27日
    200
  • python3如何利用requests模块实现爬取页面内容的实例详解

    本篇文章主要介绍了python3使用requests模块爬取页面内容的实战演练,具有一定的参考价值,有兴趣的可以了解一下 1.安装pip 我的个人桌面系统用的linuxmint,系统默认没有安装pip,考虑到后面安装requests模块使用…

    2025年2月27日
    200
  • 实例详解python3使用requests模块爬取页面内容

    本篇文章主要介绍了python3使用requests模块爬取页面内容的实战演练,具有一定的参考价值,有兴趣的可以了解一下 1.安装pip 我的个人桌面系统用的linuxmint,系统默认没有安装pip,考虑到后面安装requests模块使用…

    2025年2月27日
    200
  • Python实现有序字典方法示例

    这篇文章主要介绍了python有序字典简单实现方法,涉及python使用ordereddict方法进行字典排序的相关操作技巧,需要的朋友可以参考下 本文实例讲述了Python有序字典简单实现方法。分享给大家供大家参考,具体如下: 代码: #…

    2025年2月27日
    100
  • Python3如何使用SMTP协议发送E-mail电子邮件的示例

    smtp(simple mail transfer protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。下面这篇文章主要给大家介绍了关于python3如何利用smtp协议发送e-ma…

    2025年2月27日
    200
  • Python3实战爬虫之爬取京东图书的图文详解

    最近在学习python3,下面这篇文章主要给大家介绍了关于python3实战爬虫之爬取京东图书图片的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧。 前言 最近工作中遇到一…

    2025年2月27日 编程技术
    200
  • Python3实现爬虫抓取网易云音乐的热门评论分析(图)

    这篇文章主要给大家介绍了关于python3实战之爬虫抓取网易云音乐热评的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。 前言 之前刚刚入门python爬虫,有…

    2025年2月27日 编程技术
    200
  • Python3实现列表方法的示例详解

    python3 列表 序列是python中最基本的数据结构,下面这篇文章主要给大家介绍了关于python3学习笔记之列表方法的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下。 前言…

    编程技术 2025年2月27日
    100
  • python3之简单工厂模式的介绍

    这篇文章主要为大家详细介绍了python3设计模式之简单工厂模式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 在Python3环境下,调试实现了《大话设计模式》中简单工厂模式,通过定义单独的工厂类,完成对具体的产品的实例化,参考链接 …

    编程技术 2025年2月27日
    200
  • python实现连接数据库的方法介绍

    这篇文章主要为大家详细介绍了python连接数据库的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 MYSQL模块暂时还不支持python3.0以上的版本,由于我下载的python是3.0版本的,所以想要连接数据库只能利用其它的方法…

    2025年2月27日
    200

发表回复

登录后才能评论