基础术语
类是一个特殊的对象
示例
class Animal:
# 定义一个 类 属性
count=0
def __init__(self,name):
self.name=name
Animal.count=Animal.count+1
animal1=Animal("小白")
animal2=Animal("小黑")
animal3=Animal("小绿")
print("查看类属性的变化次数:%d" %Animal.count)
输出结果
类方法
**语法
**
@classmethod
def 类方法名(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
def 静态方法名():
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__方法
**
示例
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)
**输出结果
**
全部0条评论
快来发表一下你的评论吧 !