1.10 类、方法、封装、继承、多态、装饰器

news2024/11/22 1:05:09

一、介绍类

类(class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例

实例化:创建一个类的实例,类的具体对象。

对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法

方法:类中定义的函数

类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。

类变量通常不作为实例变量使用。

实例变量:在类的声明中,属性是用变量来表示的,这种变量就称为实例变量,实例变量就是一个用 self 修饰的变量。

继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是模拟"是一个(is-a)

"关系(例图,Dog是一个Animal)。方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写

=====================================

二、定义类

(1)class  关键字 声明一个类

(2)class  类定义方法

第一种:class  类名(object):     新式类

第二种:class  类名():

第三种:class 类名

(3)案例

class Hz(object):
    def __init__(self,name,age): #构造函数
        self.name=name   #实例变量
        self.age=age     # #实例变量
    def a(self):  #创建一个函数, 也叫方法
        print(self.name+"砍柴")
    def b(self):
        print("你们都是"+self.age)
if __name__ == '__main__':
    d=Hz("zt","18")  # 创建类的对象
    d.a()
    d.b()
(4)————init————初始化文件构造函数

1、定义类的时候__init__是一个构造函数,该函数是两个下划线开头和两个下划线结束,其作用就是当创建类的对象和实例时系统会自动调用构造函数,通过构造函数对类进行初始化操作

2、定义类的时候__init__方法中有一个参数self,这也是类中的方法与普通函数的区别,类的中的方法必须有一个参数self,而且位于参数列表的开头,在类中self就是代表类的当前类的实例(对象)自身,在python调用时无需传值,python会将对象自动传给self接受

===========================

三、类中的类变量、实例变量

1、类变量在类的下方,构造函数的上方

2、实例变量在构造函数的下方 self.开头

 ===========================

类中的实例方法、动态方法、静态方法

(1)实例方法:

class Hz(object):
    name="jz" #类变量
    def __init__(self,name,age): #构造函数
        self.name=name   #实例变量
        self.age=age     # #实例变量
    def a(self):  #创建一个函数, 也叫方法
        print(self.name+"砍柴")
    def b(self):
        print("你们都是"+self.age)
if __name__ == '__main__':
    d=Hz("zt","18")  # 创建类的对象
    d.a()
    d.b()

(2)动态方法(也叫类方法)

class Hz(object):
    name="jz" #类变量
    def __init__(self,name,age): #构造函数
        self.name=name   #实例变量
        self.age=age     # #实例变量
    def a(self):  #创建一个函数, 也叫方法
        print(self.name+"砍柴")
    def b(self):
        print("你们都是"+self.age)
    @classmethod
    def d(cls):
        print(cls.name)
if __name__ == '__main__':
    d=Hz("zt","18")  # 创建类的对象
    d.d()

(3)静态方法(私有方法),装饰器
class Hz(object):
    name="jz" #类变量
    def __init__(self,name,age): #构造函数
        self.name=name   #实例变量
        self.age=age     # #实例变量
    def a(self):  #创建一个函数, 也叫方法
        print(self.name+"砍柴")
    def b(self):
        print("你们都是"+self.age)
    @classmethod
    def d(cls):
        print(cls.name)
    @staticmethod
    def sy(name):
        print("私有方法"+name)
if __name__ == '__main__':
    d=Hz("zt","18")  # 创建类的对象
    d.sy("yuyan")

备注:(1)静态方法,实例方法(self),动态方法 (cls)
      
===============================================
类的三大特性:

封装、 继承、多态

一、封装:
1、封装:封装就是隐藏对象一些不希望外部所访问到的属性和方法,保证安全
2、概念:指的是在设计时,不对外提供,隐藏起来,提供公共方法以外对其方法就是把属性和方法封装到一个抽象的类中,

3、封装相当于一个黑盒子,我们将事务相关的属性和方法封装在一个类中,在调用类创建实例,不用关注内部代码的实现细节,我们只要调用结果就可以。

4、封装的优点:
(1)封装数据可以很好的保护隐私、
(2)封装方法主要原因是隔离复杂度
(3)封装提高了代码的复用性
(4)隐藏对象的属性和实现细节,提供公共方法对其访问


5、python中类的封装分为两种:
(1)公用(共用)
类中变量和方法公用,他们名称前没有下滑线,共有的变量和方法,在类的外部,内部以及子类都可以调用
(2)私用 
在类中变量和方法中,___下滑线开头命名,则改变变量或方法为私用,私有的变量和方法,只能在内部使用,类的尾部以及子类都无法使用。
私有属性:格式 ___属性名 =值    在类的外部不能使用(对象不能调用属性)
私有化封装后的限制:
a、类可以访问
b、类外,对象外  不可访问
c子类和子类的对象   不可访问

案例1:数据封装:
class  sjfz():
    def  __init__(self,name,age):
        self .name=name
        self.age=age
案例2:方法封装
class  sjfz(object):
    def  __init__(self,name,age):
        self .name=name #
        self.age=age
    def  getname(self):#方法封装
        print(self.name)
案例3:私有方法
class  Sjfz(object):
    def  __init__(self,name,age):
        self .name=name #
        self.age=age
    def  getname(self):#方法封装
        print(self.name)
    def  __sy(self):
        print(self.age)
    def  sydy(self):
        self.__sy()
if __name__ == '__main__':
    d=Sjfz("ZJ","18")
    d.getname()
    d.sydy()   #d只能调用sydy函数,无法直接调用__sy函数。

案例4:
class  Sjfz(object):
    def  __init__(self,name,age):
        self .__name=name #私有变量
        self.__age=age   #私有变量
    def  setname(self,newname):#方法封装,改变私有变量的值
        self.__name=newname
    def  getname(self):  
        return  self.__name
if __name__ == '__main__':
    d=Sjfz("ZJ","18")
    d.setname("zt")
    print(d.getname())
=====================================
继承:

1、继承:类的继承是面向对象程序设计的一个重要思想,继承时子类可以继承父类的内容,包括成员变量和成员函数。

2、在继承中一个类被另外一个类继承这个类称之为父类也称之为基类,则另外一个类则为子类也称之为派生类

案例1:
class   F(object):
    def  fh(self):
        print("富豪")
class M():
    def  fp(self):
        print("富婆")
class S(F,M):
    def  qg(self):
       print("乞丐")

if __name__ == '__main__':
    s=S()
    s.qg()
    s.fh()
    s.fp()
========================================
多态

1、多态是以继承和重写父类方法为前提,对所有子类实例化产生的对象调用相同的方法,执行产生不同的执行结果。

2、例如同样是人,但是当问起一个人的职业时会有不同的结果,可能是软件测试工程师,可能是HR

3、一个对象的属性和行为不是由他所继承的父类决定的,而是由其本身包含的属性和方法决定的

案例1:
class  A(object):
    def  talk(self):
        print("我是动物")
class  Cat(A):
    def  talk(self):
        print("喵喵")
class  Dog(A):
    def talk(self):
        print("汪汪")
if __name__ == '__main__':
    c=Cat()
    c.talk()  #喵喵
    d=Dog()
    d.talk()  #汪汪
====================
案例2:
class  Cc(object):
    def cs(self,x,y):
        print(x+y)
if __name__ == '__main__':
    c=Cc()
    c.cs(1,2) #数值
    c.cs("1","2") #字符
    c.cs(" 杭州","多测师") # 汉字
====================
案例3:
class F(object):#定义一个父类
    def  work(self):
        print("测试")
class   S1(F):#定一个类重写父类方法
    def work(self):
        print("开发")
class   S2(F):#定一个类重写父类方法
    def work(self):
        print("测试开发")
class  p(object):
    def  r_work(self,F):
        F.work()
if __name__ == '__main__':
    f=F()
    f.work()
    s1=S1()
    s1.work()
    s2 = S2()
    s2.work()
    r=p()
    r.r_work(f)
    r.r_work(s1)
    r.r_work(s2)

====================
拓展:
一、

 二、装饰器

(1)装饰器定义:
装饰器,本质是一个pyhton函数,他可以让其他函数在不需要做任何代码改动的前提下(增加额外功能),装饰器的返回值也是一个函数对象。
(2)应用场景:
插入日志,性能测试,事务处理,缓存,权限校验等场景
常见的装饰器:
内置装饰器,类装饰器,函数装饰器,带参数的函数装饰器

案例:
class A():
def init(self):
self.name =“wangwang”
self.__myname=“jingjing”
def a(self):
print(“001”)
def __b(self):
print(“002”)
def c(self):
print(“003”)
self.__b()
@property
def age(self):
return self.__myname
if name == ‘main’:
x=A()
print(x.name)
print(x.age)

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

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

相关文章

FebHost:意大利个人或企业都注册.IT域名吗?

对于广大意大利企业而言,拥有一个属于自己的”.IT”域名已经成为了一种标准做法。无论是中小型本土企业还是知名跨国公司,他们都纷纷选择这一突出意大利特色的国家顶级域名来彰显自身的品牌形象。 数据显示,截至2023年6月,在全球注册的350多万个”.IT”域名中,有超过220万个来…

python pytz是什么

pytz模块常用于时区的转换,常常配合datetime一起使用。我们知道datetime除了data方法生成的时间是没有时区概念,其他如time、datetime等都是有时区概念,即指定了tzinfo信息。 >>> import datetime >>> datetime.datetime.n…

FPGA工程师职业发展道路

作为FPGA工程师,你可以通过以下几个步骤来发展自己的职业道路: 1. 学习基础知识:首先,你需要学习数字电路设计和计算机体系结构的基础知识。了解FPGA的原理、架构和工作原理是非常重要的。 2. 掌握HDL编程语言:掌握至…

企微侧边栏开发(内部应用内嵌H5)

一、背景 公司的业务需要用企业微信和客户进行沟通,而客户的个人信息基本都存储在内部CRM系统中,对于销售来说需要一边看企微,一边去内部CRM系统查询,比较麻烦,希望能在企微增加一个侧边栏展示客户的详细信息&#xf…

有效的数独-java

题目描述: 请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图&#…

C++实现A*路径规划的库

作者:CodeLikeAGirl 编译:东岸因为一点人工一点智能公众号 C实现A*路径规划的库本文中,我们探索了A*路径规划在Robotic Project C中的迷人世界,了解了一些超酷的C库。https://mp.weixin.qq.com/s/WyTIzkmWS-0t5oaII6or-Q 01 A*…

ventoy_grub2_boot_win7_win10.md

ventoy (grub2) 的 extMenu启动 win7 efi 、win10 efi ventoy界面按F6(extMenu菜单) 弹出 ventoy/ventoy_grub.cfg中的菜单内容 ventoy (grub2) 的 extMenu启动 win7 efi 1. 生成 老式 分区启动记录 EFI\Microsoft\Boot\bootmgfw.efi: 命令: bcdboot…

知识图谱构建三要素:实体、关系与属性技术与实战全解析

目录 一、知识图谱三要素简介实体(Entity)的重要性关系(Relationship)的作用属性(Attribute)的应用 二、实体(Entity)理论介绍实体的概念细节实体的分类实体识别的技术细节实体识别的…

element plus的el-image图片发布到nginx不显示

问题&#xff1a; <el-image alt""src"/img/month-b.png" class"card-icon"style"width: 89px;height: 89px;right: -7px;top: -5px;"/> 部署到nginx二级路由访问地址是&#xff1a; http://192.168.1.207/divided/# 这时候使用…

大咖论道 | RPA与AI在企业数字化转型中的角色与未来

前言&#xff1a;在ISIG-RPA峰会的圆桌论坛中&#xff0c;由中投创展创始人兼CEO任威主持了关于企业自动化转型的深入讨论&#xff0c;嘉宾包括UiPath大中华区资深技术经理王栊、SAP业务技术平台卓越中心方案架构师阎韶华和三井住友保险中国区信息技术部负责人陈婧。 讨论焦点…

Acwing_795前缀和 【一维前缀和】+【模板】二维前缀和

Acwing_795前缀和 【一维前缀和】 题目&#xff1a; 代码&#xff1a; #include <bits/stdc.h> #define int long long #define INF 0X3f3f3f3f #define endl \n using namespace std; const int N 100010; int arr[N];int n,m; int l,r; signed main(){std::ios::s…

吴恩达2022机器学习专项课程(一) 4.2 梯度下降实践

问题预览/关键词 本节内容梯度下降更新w的公式梯度下降更新b的公式的含义α的含义为什么要控制梯度下降的幅度&#xff1f;导数项的含义为什么要控制梯度下降的方向&#xff1f;梯度下降何时结束&#xff1f;梯度下降算法收敛的含义正确更新梯度下降的顺序错误更新梯度下降的顺…

6.RGB转YCbcr

1.方法 RGB转灰度有很多种方式   1.将RGB中任意分量拿出来当做灰度值。   2.取RGB三通道的均值来当灰度值。   3.将RGB转YUV(YCbCr)然后取Y分量作为灰度值。   其余的几种实现方式较为简单&#xff0c;这里不做介绍。重点实现RGB转YCbCr。 1.1 YUV(YCbCr)格式 Y表示亮…

Web开发-Django学习笔记

客户端如何获取服务端的数据信息&#xff1f; 通常 是 HTTP网络协议&#xff0c;通过网络传输数据信息。 客户端通过HTTP协议发送请求信息给服务端&#xff0c;并从服务端接收响应信息。 Web 前端开发&#xff1a; &#xff08;HTML、CSS、JS&#xff09;文件部署在后端服务…

华为广告打包报错,问题思考

华为广告打包时报错 fata日志不一样能反映出完整的错误日志信息&#xff0c;仅看fata日志具有误导性&#xff0c;有可能指向错误的方向。 通过看完整的日志可见&#xff0c;错误的原因为 Caused by: java.lang.ClassNotFoundException: com.huawei.hms.ads.base.R$dimenfata日…

Java基础概念(二)

idea 工欲善其事&#xff0c;必先利其器&#xff0c;所以在真正编写代码之前先下载idea工具&#xff0c;idea是用于java语言开发的集成环境&#xff0c;是业界目前公认的用于Java开发最好的工具&#xff0c;把代码编写、编译、运行、调试等功能综合到一起的开发工具 下载地址…

解决npm init vue@latest证书过期问题:npm ERR! code CERT_HAS_EXPIRED

目录 一. 问题背景 二. 错误信息 三. 解决方案 3.1 临时解决办法 3.2 安全性考量 一. 问题背景 我在试图创建一个新的Vue.js项目时遇到了一个问题&#xff1a;npm init vuelatest命令出现了证书过期的错误。不过这是一个常见的问题&#xff0c;解决起来也简单。 二. 错误…

uni-app项目打包步骤和踩过的坑(一)

最近接了一个前同事留下的uni-app的项目&#xff0c;之前没有接触过&#xff0c;好在以前的工作中用到过vue做过前台开发&#xff0c;虽然时间不长&#xff0c;但是有些方面还是可以借鉴的。经过前几篇文章的介绍&#xff0c;我已经补完了后台服务代码&#xff0c;打算发布到设…

QT布局管理和空间提升为和空间间隔

QHBoxLayout&#xff1a;按照水平方向从左到右布局&#xff1b; QVBoxLayout&#xff1a;按照竖直方向从上到下布局&#xff1b; QGridLayout&#xff1a;在一个网格中进行布局&#xff0c;类似于HTML的table&#xff1b; 基本布局管理类包括&#xff1a;QBoxLayout、QGridL…

AI人像写真解决方案,满足企业多样化视觉需求

美摄科技&#xff0c;作为一家专注于人工智能技术研发与应用的高新企业&#xff0c;深知企业对于高质量、高效率视觉内容的需求&#xff0c;特推出AI人像写真解决方案&#xff0c;为企业打开全新的视觉营销通道。 我们的AI人像写真解决方案&#xff0c;基于深度学习和计算机视…