pythonでのクラスの学習:クラス属性、インスタンス属性_new__方法:シングルモード

4341 ワード

≪インスタンス・プロパティ|Instance Properties|oem_src≫:特定のインスタンス・オブジェクトと関係があります.
1つのインスタンスオブジェクトと別のインスタンスオブジェクトは属性を共有しません
≪クラス・プロパティ|Class Properties|ldap≫:クラス・プロパティが属するクラス・オブジェクト
複数のインスタンスオブジェクト間で同じクラス属性を共有し、クラス定義時に一度だけ定義します.
#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
'''