快速掌握——python类 封装[私有属性方法]、继承【python进阶】(内附代码)

1.类的定义 与 实例化对象

在python中使用class关键字创建一个类。

举例子

class Stu(object):id = '1001'name = '张三'def __init__(self):passdef fun1(self):pass# 实例化对象
s1 = Stu()
s2 = Stu()
print(s1.name)
print(s2.name)

第一个方法 __init__是一种特殊的方法,称为构造函数或者初始化函数,并不是必须的,需要的时候添加即可。

第二个 self参数表示的是实例化对象的id号,每次调用的时候self和对象的id号进行自动绑定。

1.1.访问属性/方法

使用符号 . 进行访问

    # 访问属性

       对象名.属性

    # 访问方法

       对象名.方法名()

class Person:def __init__(self, name, age):self.name = nameself.age = agedef introduce(self):print(f"我的名字是 {self.name},我今年 {self.age} 岁。")# 创建Person类的一个实例
person1 = Person("张三", 30)# 调用实例的方法# 访问属性
person1.age=60          #对象名.属性# 访问方法
person1.introduce()     #对象名.方法名()

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

  • getattr(obj, name[, default]) : 访问对象的属性。
  • hasattr(obj,name) : 检查是否存在一个属性。
  • setattr(obj,name,value) : 设置一个属性。如果属性不存在,会创建一个新属性。
  • delattr(obj, name) : 删除属性。

1.2 对象与类的关系

  1. 对象拥有    的    所有属性和方法
  2. 对象的  属性和方法  可以   单独添加、删除、修改
  3. 对象与对象之间的属性和方法不可共享
  4. 对象不能独自创建,必须依托于类,类可以实例化N个对象
class Stu(object):id = '1001'name = '张三'def fun1(self):pass# 实例化对象
s1 = Stu()
s2 = Stu()
# 对象的属性可以单独修改、添加、删除
s1.name = '李四'
s1.age = 18
del s1.age
print(s1.name)
# print(s1.age)
print(s2.name)
# print(s2.age)

1.3 魔方方法——构造函数 与 析构函数

        魔方方法是一种特殊的命名约定,它们以双下划线开始和结束。这些方法在特定的条件下会被Python解释器自动调用为Python类添加了动态的、面向对象的行为

  1. __init__ 构造函数:完成对象的初始化工作,方便统一管理、调用类创建对象时,自动执行。
  2. __del__ 析构函数:删除对象时执行一些操作,自动执行。
  3. __str__ 打印方法:输出执行信息,自动执行。
class Car(object):def __init__(self, name, color):self.name = nameself.color = colordef __str__(self):return f"车品牌{self.name} 颜色{self.color}"def __del__(self):print(f"{self.name}报废了,去车管所吧")c1 = Car("奥迪", "黑色")
c2 = Car("小米su7", "紫色")print(c1.name, c2.name)
print(c1)
print(c2)
# print(str(c1))

_init__(self[, ...]): 构造器方法,当创建一个新对象时被调用,用于初始化对象。

__del__(self): 析构器方法,当对象被销毁之前被调用,用于清理资源。
__str__(self): 返回对象的字符串表示形式,常用于 print() 函数或 str() 函数。
__repr__(self): 返回一个准确无误的字符串表示形式,用于调试或开发,比 __str__ 更加详细
__len__(self): 定义当对对象使用 len() 函数时的行为,返回容器的长度。
__getitem__(self, key): 实现了对象的索引访问,如 my_obj[key]。
__setitem__(self, key, value): 允许设置对象的索引值,如 my_obj[key] = value。

__iter__(self): 使对象成为可迭代的,返回一个迭代器对象。

__next__(self): 在迭代器中定义 next() 行为,返回下一个值。

__call__(self[, args...]): 使得对象可以像函数一样被调用,例如 my_obj().

__add__(self, other): 定义加法操作符 + 的行为,如 my_obj + other_obj。
__eq__(self, other): 定义等于运算符 == 的行为,用于比较两个对象是否相等

1.4 类属性/方法 与 实例对象属性/方法 与 静态方法

属性: 

class Student(object):"""定义了一个学生类"""grade = 'py24101'       # 类属性def __init__(self, name, age):self.name = name    # 实例对象属性self.age = age      # 实例对象属性s1 = Student('张三', 18)# 类属性的访问
print(Student.grade)
print(s1.grade)# 实例属性的访问
# print(Student.name)    报错!!!#类 不能访问 实例对象的属性#相当于闭包,内可以访问外,外不能访问内
print(s1.name)
class Bank(object):"""定义了一个银行卡类,用于初始化、存钱、取钱"""total_money = 0def __init__(self, name, money):self.name = nameBank.total_money += money    #改为self.#Bank.total_money 通过类 调用 类属性def save(self, money):               #self.total_money 通过对象 调用 类属性Bank.total_money += moneydef draw(self, money):Bank.total_money -= moneyb1 = Bank('张三', 1000)
print(b1.total_money)
b1.save(5000)
print(b1.total_money)
b1.draw(3000)
print(b1.total_money)b2 = Bank('李四', 8888)
print(b2.total_money)
b2.save(10000)
print(b2.total_money)

类方法、实例方法、静态方法:

class Student(object):"""定义了一个学生类"""grade = 'py24101'@classmethoddef cls_fun(cls):"""类方法中只能调用类属性和类方法"""print(f"班级名称是{cls.grade}")def __init__(self, name, age):self.name = nameself.age = agedef fun1(self):"""实例方法中能调用类属性、实例属性"""print(f"实例方法中输出类属性{self.grade}, 输出实例属性{self.name}")@staticmethoddef sta_fun(x):print(f"{x}静态方法一般实现与类和对象无关联的操作,例如:游戏说明书等")s1 = Student('张三', 18)
# 如何调用类方法
Student.cls_fun()
s1.cls_fun()# 如何调用实例方法
Student.fun1(s1)
s1.fun1()# 如何调用静态方法
Student.sta_fun(3)
s1.sta_fun(3)

1.5 Python的内置类属性

  • __dict__ : 类的属性(包含一个字典,由类的数据属性组成)
  • __doc__ :类的文档字符串
  • __name__: 类名
  • __module__: 类定义所在的模块(类的全名是'__main__.className',如果类位于一个导入模块mymod中,那么className.__module__ 等于 mymod)
  • __bases__ : 类的所有父类构成元素(包含了一个由所有父类组成的元组)
class Student(object):"""定义一个学生类属性:名字 年龄方法:method_1 method_2"""name = '张三'age = 18def method_1(self):passdef method_2(self):passprint(Student.__dict__)
print(Student.__doc__)
print(Student.__name__)
print(Student.__module__)
print(int.__module__)
print(Student.__bases__)

2.类的封装【私有属性与方法】

封装指的是隐藏对象中一些不希望让外部所访问的属性或方法

python中封装是通过设置访问权限来体现的,私有属性私有方法控制访问权限的组成部分。

2.1 私有属性

              在类的内部使用,不希望外部直接访问的变量

              在python中,使用双下划线作为前缀定义私有属性

              私有属性在类外不能访问

class Bank(object):"""定义了一个银行卡类属性:name     pwd密码【我不希望外部访问】"""def __init__(self, name, pwd):self.name = nameself.__pwd = pwd# 为了在某些需要的时候,访问到私有属性,所以需要在类内部设置两个接口def get_pwd(self):return self.__pwddef set_pwd(self, newpwd):self.__pwd = newpwd# print(Bank.__pwd)b1 = Bank('张三', '123456')
print(b1.name)
# print(b1.__pwd)
print(b1.get_pwd())
b1.set_pwd('666888')
print(b1.get_pwd())

2.2 私有方法

和私有属性是一样的。

class Bank(object):"""定义了一个银行卡类属性:name     pwd密码【我不希望外部访问】"""def __init__(self, name, pwd):self.name = nameself.__pwd = pwddef __info(self):print(f"名字{self.name}, 密码{self.__pwd}")def get_info(self):self.__info()# Bank.__info() 报错
b1 = Bank('李四', '123456')
# b1.__info()   报错
b1.get_info()

2.3 属性装饰器

        属性装饰器是实现把方法转为属性的装饰器

作用:

                1.  把方法转为属性,便于操作属性

                2 . 实现对属性的更改(验证)、查看、删除

语法格式:

class 类名(object):

        def __init__(self):

                self.__名字 = xxx

        @property def 函数名(self):

                return self.__名字

        @函数名.setter def 函数名(self, m):

                self.__名字 += m

class Car(object):def __init__(self, name, color):self.name = nameself.color = colorself.__num = 20@propertydef num(self):return self.__num@num.setterdef num(self, x):self.__num += xc1 = Car('法拉利', '红色')
print(c1.name, c1.color, c1.num)
c1.num = 80
print(c1.num)

class Student(object):def __init__(self, name):self.__name = name@propertydef name(self):return self.__name@name.setterdef name(self, new_name):if not isinstance(new_name, str):print('名字必须是一个字符串')else:self.__name = new_name@name.deleterdef name(self):print("已删除名字")del self.__names1 = Student('张三')
print(s1.name)
s1.name = 111
s1.name = '华清远见'
print(s1.name)
del s1.name

3.类的继承

                        面向对象的编程带来的主要好处之一就是代码的重用,

                        实现这种重用的方法之一就是通过继承机制。

                        通过继承创建的新类称之为【子类】或者【派生类】,

                        被继承的类称之为【父类】、【基类】、【超类】。

3.1 继承语法格式

class  子类名(父类名列表):pass
class Parent(object):"""定义父类"""par_attr = 100def __init__(self):print("初始化父类")def par_fun1(self):print("父类方法1")def par_fun2(self):print("父类方法2")class Child(Parent):"""定义子类"""child_attr = 666def __init__(self):print("初始化子类")def child_fun1(self):print("子类方法1")c1 = Child()
print(c1.child_attr)
c1.child_fun1()print(c1.par_attr)
c1.par_fun1()
c1.par_fun2()

3.2 多继承语法【不建议乱用】

如果在继承的元组()里面有一个以上的类,就称之为多继承。

# python中提供了一个函数mro()用于查看继承的顺序

class A:passclass B:passclass C:passclass D(A, B, C):passd1 = D()
print(D.mro())

3.3 继承重写父类方法

如果你的父类方法不能满足你得要求,你可以在之类中重写父类的方法。

class Parent(object):def method(self):print(f"{self}的方法")class Child(Parent):passc = Child()
c.method()# 重写
class Parent(object):def method(self):print(f"{self}的方法")class Child(Parent):def method(self):print("xxxxxxxxxx")print(f"{self}的方法")c = Child()
c.method()

这里列出了一些通用的功能,可以在自己的类重写:

  1. __init__ ( self [,args...] ) 构造函数 简单的调用方法: obj = className(args)
  2. __del__( self ) 析构方法, 删除一个对象 简单的调用方法 : del obj
  3. __repr__( self ) 转化为供解释器读取的形式 简单的调用方法 : repr(obj)
  4. __str__( self ) 用于将值转化为适于人阅读的形式 简单的调用方法 : str(obj)
  5. __cmp__ ( self, x ) 对象比较 简单的调用方法 : cmp(obj, x)

3.4 python继承特点

  • 在子类中如果需要父类的构造方法,需要显式调用父类的构造方法,或者不重写父类的构造方法。__init__()
  • 在子类中调用父类的方法,需要显式调用,且第一个参数self不能省略。
class Parent(object):def __init__(self, x, y):self.x = xself.y = ydef method(self):print(f"{self}的方法")class Child(Parent):def fun1(self):print(self.x , self.y)
# 不重写父类构造方法
c = Child(1, 2)
c.fun1()

class Parent(object):def __init__(self, x, y):self.x = xself.y = ydef method(self):print(f"{self}的方法")class Child(Parent):def __init__(self, x, y, z):Parent.__init__(self, x, y)self.z = zdef fun1(self):print(self.x , self.y, self.z)# 重写父类构造方法、里面显式调用父类构造方法
c = Child(1, 2, 33)
c.fun1()
class Parent(object):def __init__(self, x, y):self.x = xself.y = yclass Child(Parent):def __init__(self, x, y, z):super().__init__(x, y)self.z = zdef add(self):return self.x + self.y + self.zc = Child(1, 1, 1)
print(c.add())
class Parent(object):def __init__(self, x, y):self.x = xself.y = ydef add(self):return self.x + self.yclass Child(Parent):def __init__(self, x, y, z):super().__init__(x, y)self.z = zdef add(self):return super().add() + self.zc = Child(1, 1, 1)
print(c.add())

3.5 运算符重载

在Python中,并没有像其他语言(如C++)中那样的内置机制来重载运算符。但是,你可以通过定义特定的方法来模拟运算符重载的行为。

以下是一些常见运算符以及它们对应的特殊方法:

加法:+ 对应 __add__

减法:- 对应 __sub__
乘法:* 对应 __mul__
除法:/ 对应 __truediv__
取模:% 对应 __mod__
幂运算:** 对应 __pow__
位运算:<< 对应 __lshift__
位运算:>> 对应 __rshift__
位运算:| 对应 __or__

位运算:& 对应 __and__

位运算:^ 对应 __xor__
class Operator(object):def __init__(self, x):self.x = xdef __add__(self, other):return self.x + other.x * 3o1 = Operator(1)
o2 = Operator(3)
print(o1 + o2)
class Operator(object):def __init__(self, x, y):self.x = xself.y = ydef __add__(self, other):return self.x * other.x + self.y * other.yo1 = Operator(1, 2)
o2 = Operator(3, 4)
print(o1 + o2)

4.类的多态

python中的多态也可以通过方法重写进行。

同一个方法,不同对象显式的结果不同。

class Animal(object):name = '动物'age = 0def speak(self):print("动物的声音")class Dog(Animal):def speak(self):print("汪汪汪")class Cat(Animal):def speak(self):print("喵喵喵")a = Animal()
d = Dog()
c = Cat()a.speak()
d.speak()
c.speak()

5. 关于下划线说明

  1. __foo__: 以双下划线开头双下划线结尾,定义的是特殊方法,一般是系统定义名字

                        类似 __init__() 之类的,自动。

  1. _foo: 以单下划线开头的表示的是 protected 类型的变量,即保护类型只能允许其本身与子类进行访问,不能用于 from module import ···
  2. __foo: 双下划线的表示的是私有类型(private)的变量, 只能是允许这个类本身进行访问了。

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

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

相关文章

HarmonyOS 如何实现传输中的数据加密

文章目录 摘要引言数据传输加密概述选择加密算法和传输协议加密实现方案与 Demo 代码配置 HTTPS/TLSAES 加密的实现代码详解RSA加密的实现代码详解 QA环节总结参考资料 摘要 本文将介绍在 HarmonyOS 应用中如何实现数据传输的加密策略。我们将讨论常见的加密算法&#xff08;如…

Bilibili-超能用户榜入口优化-技术方案反思与总结

目录 客户端实现&#xff1a; 高能用户入口实现逻辑&#xff1a; 接口服务信息&#xff08;服务端下发&#xff09;&#xff1a; 执行方案&#xff1a; (1)数据类新增服务端下发字段 ​编辑 (2) UI添加 寻找思路&#xff1a; &#xff08;3&#xff09;超能用户icon显示…

vue实现图片无限滚动播放

本人vue新手菜鸡&#xff0c;文章为自己在项目中遇到问题的记录&#xff0c;如有不足还请大佬指正 文章目录 实现效果代码展示总结 因为刚接触vue&#xff0c;本想着看看能不能用一些element的组件实现图片的轮播效果&#xff0c;尝试使用过element-UI里的走马灯Carouse&#x…

MySQL缓存使用率超过80%的解决方法

MySQL缓存使用率超过80%的解决方法 一、识别缓存使用率过高的问题1.1 使用SHOW GLOBAL STATUS命令监控1.2 监控其他相关指标二、分析缓存使用率过高的原因2.1 数据量增长2.2 查询模式变化2.3 配置不当三、解决缓存使用率过高的方法3.1 调整Buffer Pool大小3.1.1 计算合理的Buff…

LeetCode【0036】有效的数独

本文目录 1 中文题目2 求解方法&#xff1a;python内置函数set2.1 方法思路2.2 Python代码2.3 复杂度分析 3 题目总结 1 中文题目 请根据以下规则判断一个 9 x 9 的数独是否有效。 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线…

UNIAPP发布小程序调用讯飞在线语音合成+实时播报

语音合成能够将文字转化为自然流畅的人声&#xff0c;提供100发音人供您选择&#xff0c;支持多语种、多方言和中英混合&#xff0c;可灵活配置音频参数。广泛应用于新闻阅读、出行导航、智能硬件和通知播报等场景。 在当下大模型火爆的今日&#xff0c;语音交互页离不开语音合…

成都睿明智科技有限公司解锁抖音电商新玩法

在这个短视频风起云涌的时代&#xff0c;抖音电商以其独特的魅力迅速崛起&#xff0c;成为众多商家争夺的流量高地。而在这片充满机遇与挑战的蓝海中&#xff0c;成都睿明智科技有限公司犹如一颗璀璨的新星&#xff0c;以其专业的抖音电商服务&#xff0c;助力无数品牌实现从零…

Llama旋转位置编码代码实现及详解

旋转位置编码RoPE 在旋转位置编码与Transformer和BERT之间的区别中介绍了旋转位置编码&#xff08;RoPE&#xff09;的特点和优势&#xff0c;这种输入长度动态可变的优势使得在Llama编码时&#xff0c;不需要掩码将多余的嵌入掩住。为了详细了解RoPE是如何实现的&#xff0c;…

遇到“msvcr120.dll丢失”要怎么解决?详解msvcr120.dll的解决方法

遇到“msvcr120.dll丢失”错误通常表明你的系统缺少一个关键的DLL文件&#xff0c;这是Microsoft Visual C 2013的一部分。这个问题可能导致某些程序无法运行&#xff0c;影响电脑性能。不过&#xff0c;解决这一问题并不复杂。接下来&#xff0c;本文将向你展示几种简单的修复…

【机器学习】平均绝对误差(MAE:Mean Absolute Error)

平均绝对误差 (Mean Absolute Error, MAE) 是一种衡量预测值与实际值之间平均差异的统计指标。它在机器学习、统计学等领域中广泛应用&#xff0c;用于评估模型的预测精度。与均方误差 (MSE) 或均方误差根 (RMSE) 不同&#xff0c;MAE 使用误差的绝对值&#xff0c;因此它在处理…

项目功能--运营数据统计

一、需求分析 通过运营数据统计可以展示出体检机构的运营情况&#xff0c;包括会员数据、预约到诊数据、热门套餐等信息。我们要通过一个表格的形式来展示这些运营数据。如下图&#xff1a; 二、代码实现 实现步骤&#xff1a; 步骤一&#xff1a;定义数据模型&#xff0c;通过…

网络安全技术在能源领域的应用

摘要 随着信息技术的飞速发展&#xff0c;能源领域逐渐实现了数字化、网络化和智能化。然而&#xff0c;这也使得能源系统面临着前所未有的网络安全威胁。本文从技术的角度出发&#xff0c;探讨了网络安全技术在能源领域的应用&#xff0c;分析了能源现状面临的网络安全威胁&a…

wangeditor富文本编辑器以文本的形式展示公式

最终展示的效果 1.首先将要传给后端的富文本值进行转化 //假设workContent是富文本写入的值this.workContent this.escapeHTML(this.workContent)//通过escapeHTML方法转化传给后端 methods:{escapeHTML(str) {return str.replace(/&/g, &amp;) // 将 & 替换为…

内置RTK北斗高精度定位的4G执法记录仪、国网供电服务器记录仪

内置RTK北斗高精度定位的4G执法记录仪、国网供电服务器记录仪BD311R 发布时间: 2024-10-23 11:28:42 一、 产品图片&#xff1a; 二、 产品特性&#xff1a; 4G性能&#xff1a;支持2K超高清图传&#xff0c;数据传输不掉帧&#xff0c;更稳定。 独立北…

【自学笔记】神经网络(2) -- 模型评估和优化

文章目录 划分数据集训练集和测试集训练误差 测试误差交叉验证测试集 偏差与方差偏差方差表现基准 学习曲线error - train set sizeerror - degree of polynomial 数据增强迁移学习项目的完整周期样本不平衡问题精确率和召回率精确率与召回率的平衡 划分数据集 我们当然希望把所…

Windows 局域网IP扫描工具:IPScaner 轻量免安装

IPScaner是一款258KB的工具&#xff0c;具备快捷修改IP、批量扫描、地址计算等功能&#xff0c;自动识别本机IP网段&#xff0c;快速查看IP使用情况&#xff0c;适用于监控维护、企业IT运维等场 软件功能介绍&#xff1a; 1&#xff09;快捷修改本地IP、IP批量扫描、IP地址计算…

2024 年Postman 如何安装汉化中文版?

2024 年 Postman 的汉化中文版安装教程

SQL面试题——飞猪SQL面试 重点用户

飞猪SQL面试题—重点用户 在一些场景中我们经常听到这样的一些描述&#xff0c;例如20%的用户贡献了80%的销售额&#xff0c;或者是20%的人拥有着80%的财富&#xff0c;你知道这样的数据是怎么算出来的吗 数据如下,uid 是用户的id ,amount是用户的消费金额 |uid|amount| ---…

fork函数详解

前言 之前我们提到&#xff0c;创建子进程的时候&#xff0c;需要使用fork()函数&#xff0c;其中分别有id 0和id >0的if函数&#xff0c;但是实验表明&#xff0c;两个if函数中的内容都得到了实现。按照我们之前所学&#xff0c;一个变量同一时间只能有一个值&#xff0c;…

OkHttp网络请求框架

添加依赖 在 build.gradle 文件中添加 OkHttp 依赖&#xff1a; dependencies {implementation("com.squareup.okhttp3:okhttp:4.10.0") }使用OkHttp发起GET请求 同步请求 public class MainActivity extends AppCompatActivity {// Used to load the okhttptes…