类基础术语
使用 类名() 创建对象,**创建对象 **的动作有两步在内存中为对象 分配空间调用初始化方法 init 为对象初始化对象创建后,内存中就有了一个对象的** 实例**通常会把创建出来的 对象 叫做 类 的实例创建对象的 **动作 **叫做 实例化对象的属性 叫做** 实例属性**在程序执行时对象各自拥有自己的 实例属性调用对象方法,可以通过 self. 访问自己的属性或方法每一个对象 都有一个自己独立的内存空间,互不干涉多个对象的方法, 在内存中只有一份 ,在调用方法时,需要把对象的引用传递到方法内部类是一个特殊的对象
python 中 一切皆对象类是一个特殊的对象,同样会被加载到内存中,类对象在内存中只有一份一个类可以创建出多个对象实例除了封装** 实例 的属性和方法**外,类对象还可以拥有自己的属性和方法通过** 类名.** 的方式可以访问类的属性和方法示例
class animal: # 定义一个 类 属性 count=0 def __init__(self,name): self.name=name animal.count=animal.count+1animal1=animal(小白)animal2=animal(小黑)animal3=animal(小绿)print(查看类属性的变化次数:%d %animal.count)输出结果
类方法
**类方法 就是针对 类对象 **定义的方法在类方法 内部可以直接访问 类属性 或者调用其他的 类方法类方法需要用** 修饰器 @classmethod **来标识,告诉解释器这是一个 类方法类方法的 第一个参数 应该是 cls由 哪一个类调用的方法 ,方法内的 cls ,就是哪一个类的引用这个参数和 实例方法的第一个参数 self 类似不使用 cls ,使用其他名称也可以,习惯问题通过 **类名. **调用类方法,不需要传递 cls 参数在方法内部,可以通过** cls.** 访问类的属性或类的方法**语法
**
@classmethoddef 类方法名(cls): pass示例
class animal: # 定义一个 类 属性 count=0 def __init__(self,name): self.name=name animal.count=animal.count+1 # 定义一个 类 方法 @classmethod def show_count(cls): print(我是类方法,类属性的值是:%d%cls.count)animal(小白)animal(小黑)# 调用类 方法animal.show_count()输出结果
静态方法
使用修饰器 @staticmethod 来标识通过 **类名. **调用 静态方法使用场景不需要访问** 实例属性** 或者调用** 实例方法**不需要访问** 类属性** 或者调用 类方法语法
@staticmethoddef 静态方法名(): pass示例
class person: # 定义类属性 count=0 def __init__(self,name): self.name=name # 定义一个静态方法,静态方法不能调用 类方法或属性 与 实例方法或属性 @staticmethod def static_test(): print(我是一个静态方法,不能调用类方法与属性 和实例方法与属性)# 静态方法直接用 类名调用person.static_test()输出结果
综合练习示例
需求:窗口取票票数是共有的每个人取的数量不一样操作提示信息,不与任何属性或方法关联class ticket: # 总共 10 张票 totalticket=10 def __init__(self,name): self.name=name # 操作说明,可以使用静态方法实现 @staticmethod def show_instructions(): print(操作说明:取票的数量不能超过票总数量!!!) # 显示总票数,可以使用 类方法 @classmethod def show_ticket(cls): print(还剩余的票数有:%s 张 %cls.totalticket) # 取票,可以使用实例方法 def take_ticket(self,num): ticket.totalticket=ticket.totalticket-num print(%s 取走了 %d 张票...%(self.name,num))# 取票的操作说明 ticket.show_instructions()# 开始取票,张三 取3张, 李四取4张zs=ticket(张三)zs.take_ticket(3)#查看剩余票数ticket.show_ticket()ls=ticket(李四)ls.take_ticket(4)#查看剩余票数ticket.show_ticket()输出结果
单例模式设计模式
**设计模式 **是针对某一特定问题的解决方案,由人们总结和提炼的使用设计模式 是为了可重用代码, 使代码更容易理解,保证代码可靠性单例设计模式目的: 让类创建的对象,在系统中只有 唯一一个每一次执行 **类名() **返回的内存地址引用,都是同一个**__new__方法
**
使用 类名() 创建对象时, python的解释器首先会调用** new **方法为对象 分配内存空间python的解释器获得对象的引用后,将引用作为第一个参数,传递给 **init **方法重写 new 方法的代码非常固定重写 new 方法一定要 return super(). new (cls)否则 python的解释器 得不到对象引用,就不会调用初始化方法**new **是一个 静态方法 ,在调用时需要 主动传递 cls 参数示例
class singleclass(): # 定义类实例对象 instants=none # 重写 __new__ 方法 def __new__(cls,*agrs,**kwargs): print(创建对象方法.....) if singleclass.instants== none: # 初始化实例对象,调用父类方法 singleclass.instants=super().__new__(cls) return singleclass.instants def __init__(self): print(初始化方法。。。。)# 单例模式 ,不管创建多少次实例,实际上都是同一个s1=singleclass()s2=singleclass()s3=singleclass()print(s1)print(s2)print(s3)输出结果
以上的方法虽然解决了对象只会创建一次的问题,但是初始化的方法还会调用多次,消耗内存。 此处可以 增加一个 initflag 的标记,一但初始化后就打上标记,以后就不再进行初始化。 改造代码如下:
class singleclass(): # 定义类实例对象 instants=none # 定义一个初始化标记 initflag=false # 重写 __new__ 方法 def __new__(cls,*agrs,**kwargs): if singleclass.instants== none: print(创建对象方法.....) # 初始化实例对象,调用父类方法 singleclass.instants=super().__new__(cls) return singleclass.instants def __init__(self): if singleclass.initflag: return print(初始化方法。。。。) singleclass.initflag=true# 单例模式 ,不管创建多少次实例,实际上都是同一个s1=singleclass()s2=singleclass()s3=singleclass()print(s1)print(s2)print(s3)**输出结果
**
区块链并不代表社会将完全的去中心化
百度免费公开无人驾驶系统 走向技术最前沿
西门子中小型PLC系统S7-300简介及硬件/网络组态
自动紧急制动系统行人测试场景的研究
中国电信将为积极推进全球5G SA产业发展部署提供高价值的指导建议
Python-类、单例模式
什么是BIDI模块,BIDI模块是如何工作的?
2020下半年腾讯位于广东清远市的云计算数据中心正式启用
测报工具箱储藏各种小工具的作用是什么
12V转220V逆变器原理和电路图分析
物联网如何让水利行业变得信息化
晶闸管的工作原理解析
大联大诠鼎集团推出基于Richtek产品的MagSafe无线充电方案
中国智能手机第二季度出货量报告公布,华为反超苹果和三星
头部企业接连布局 海外动力电池回收“起风”
电子元器件的认识
雄韬氢燃料电池产业园项目武汉开工总投资115亿元
隐性/显性通信电压阈值的测试为什么重要
国际电子商情报道:全球MLCC短缺问题已缩短到10周以内
阿里所有产品将接入“通义千问”大模型全面改造