python中类的学习:类属性,实例属性 __new__方法:单例模式

实例属性:和具体的某个实例对象有关系
并且一个实例对象和另外一个实例对象是不共享属性的
类属性:类属性所属于类对象

并且多个实例对象之间共享同一个类属性,在类定义的时候只定义一次

#encoding=utf-8
#多继承的特点
class Base(object):
	def test(self):
		print("----base")
class A(Base):
	def test(self):
		print("-----A")
class B(Base):
	def test(self):
		print("----B")
class C(Base):
	def test(self):
		pass
class D(A,B):
	def test(self):
		print("----D")
class E(A,C):
	def test(self):
		pass 
e=E()
e.test()
print(E.__mro__)
#类名.__mro__:根据C3算法计算到的,显示继承的顺序E-A-C-Base,决定了调用一个方法时,搜索父类的顺序
#如果在某个类中找到了方法,那么久停止搜索

#多态的概念:定义时的类型和运行的类型不一样,此时就成了多态
#python语言是动态的
#是弱类型语言,定义变量的时候不需要定义变量的类型
class Attribute:
	num=0  #这里定义了一个类的属性,类属性
	def __init__(self,new_name):#实例方法
		self.name=new_name #这里一个定义了一个属性,直接赋值,实例属性
		Attribute.num+=1 #对类属性进行操作
	@classmethod
	def add_num(cls):#定义一个类方法 cls表示类,代表类,可以换个名字
		cls.num=100  #改变类属性 	
	@staticmethod
	def printSome():
		print("can print something")	

a1=Attribute('property')
a1.add_num() #可以通过类的名字调用此方法,也可以通过类创建的对象调用此方法
Attribute.add_num()
#调用静态方法,可以完成一个类方法和实例方法之外的简单工作
Attribute.printSome() #通过类名调用此方法
a1.printSome() #通过类对象调用此方法,都可行

#这里有个特点,实例方法参数写(self),类方法写@classmethod,参数(cls)
#x写@staticmethod,可以没有任何参数

#Attribute是一个类对象,创建的话会创建一个实例对象
#实例属性:和具体的某个实例对象有关系
#并且一个实例对象和另外一个实例对象是不共享属性的
#类属性:类属性所属于类对象
#并且多个实例对象之间共享同一个类属性,在类定义的时候只定义一次

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

__new__()方法:完成了创建,__init__()完成了初始化

#encoding=utf-8
#工厂方法模式
#__new__方法:__new__至少有一个参数cls,代表要实例化的类,此参数在实例化时由python解释器自动提供
#__new__方法必须有返回值,返回实例化出来的实例
#__init__有一个参数self,就是这个__new__返回的实例,__init__在__new__的基础上可以完成一些
#其他初始化的动作,__init__不需要返回值
#可以将类比作制造商,__new__方法就是前期的原材料购买环节,__init__方法就是在有原材料的基础上,加工,初始化商品环节
#复习一下学过的__开头的方法
class Teacher(object):
	"""docstring for Teacher"""
	def __init__(self):
		self.arg = 1
	def __del__(self):
		print("将对象删除后执行的操作")
	def __str__(self):
		print("打印对象时执行的操作")
	def __new__(cls):#这里有参数,把类当作参数传输
		print("执行new方法")
	

tea=Teacher() #这时候调用了一个方法,__new__
#运行结果:执行new方法
#1 创建一个对象;2 调用__init__()方法 3返回对象的引用
#之前在没有写new方法是时候,自动调用父类的object类的__new__()方法,现在上面例子是重写了__new__()方法,只是完成了打印功能,并没有实现创建对象
#
class Student(object):
	"""docstring for Student"""
	def __init__(self):
		self.arg = 1
	def __del__(self):
		print("将对象删除后执行的操作")
	def __str__(self):
		print("打印对象时执行的操作")
	def __new__(cls):#这里有参数,把类当作参数传输
		print("执行new方法")
		object.__new__(cls)#仍然调用父类的__new__方法,这里的cls是要创建的对象的类
		print("调用父类执行new方法")
 
stu=Student()#1 调用__new__方法来创建对象 2 调用__init__,刚创建的对象是参数self 3 返回对象的引用
#像C++中的构造函数:完成了创建和初始化,在python中分成了两个方法,分别完成创建__new__和初始化__init__
'''显示的内容:
执行new方法
将对象删除后执行的操作
调用父类执行new方法
'''

创建单例模式

#encoding=utf-8
#创建一个单例模式,即,始终打开的都是一个,若已创建则不再创建
class StudentA(object):
	__instance=None#私有属性,此类内部可以访问
	def __new__(cls):
		if cls.__instance==None:
			cls.__instance=object.__new__(cls)
			return cls.__instance
		else:
			return cls.__instance

stu=StudentA()

只能初始化一次

#encoding=utf-8
#创建一个单例模式,即,始终打开的都是一个,若已创建则不再创建
class StudentA(object):
	__instance=None#私有属性,此类内部可以访问
	def __new__(cls,name):#因为__init__有参数,所以这里也需要给定参数
		if cls.__instance==None:
			cls.__instance=object.__new__(cls)
			return cls.__instance
		else:
			return cls.__instance
	def __init__(self,name):
		self.name=name

stu=StudentA("hummy")#这种方法在__new__方法中进行了限定,只开一个单例模式,但是初始化的时候则会每次创建都会初始化
print(id(stu))
print(stu.name)
stud=StudentA("bohy")
print(id(stud))
print(stud.name)
'''显示结果
18468592
hummy
18468592
bohy
'''
class StudentB(object):
	__instance=None#私有属性,此类内部可以访问
	__initFlag=False
	def __new__(cls,name):#因为__init__有参数,所以这里也需要给定参数
		if cls.__instance==None:
			cls.__instance=object.__new__(cls)
			return cls.__instance
		else:
			return cls.__instance
	def __init__(self,name):
		if StudentB.__initFlag==False:
			StudentB.__initFlag=True
			self.name=name
stu=StudentB("hummy")#这种方法在__new__方法中进行了限定,只开一个单例模式,但是初始化的时候则会每次创建都会初始化
print(id(stu))
print(stu.name)
stud=StudentB("bohy")
print(id(stud))
print(stud.name)
'''显示的结果
18477128
hummy
18477128
hummy
'''




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一枚努力的程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值