python 类方法、静态方法、实例方法的区别,类变量、实例变量、实例私有变量、定义属性、内置属性、私有方法、继承、闭包、方法重写

class A(B): #A类继承B类,A是子类,B是父类
	'''类的说明性文字可以写在这里'''
	count=0 #类变量、全局变量
	_ass=25 #单下划线开头的变量,在其他文件同通过fromt A import * 的方式导入该模块时,不能直接调用_ass=25;可通过import A的方式导入模块,用A._ass方式调用
	__slots__=('name','age') #变量限定功能,表示该类中只允许使用这两个变量,防止使用其他变量
	def __init__(self,name,age): #初始化A类的属性,子类未定义该方法时,会自动初始化父类的属性;子类定义了该方法时,不会自动初始化父类的属性,需要自己加入初始化父类的调用,例如:B.__init__(self,country,sex)
		B.__init__(self,country,sex) #初始化父类的属性,如果父类中有参数,则必须初始化父类的属性
		self.name=name #实例变量,可以用‘实例名.变量名’调用,也可以通过方法‘实例名.get_变量名()’调用
		self.__age=age #实例私有变量,不可以用‘实例名.变量名’调用,能通过方法‘实例名.get_变量名()’调用(也可用‘实例名._类名__变量名’调用,不推荐),好处是防止外部直接通过'实例名.age=值'来进行赋值,容易产生脏数据
	def a(self): #实例方法,参数中必须含self,只能被实例调用;调用该方法时,系统会自动将实例的地址传入self
		global count #使用全局变量的方法
		count+=1
		id='123' #局部变量
		return id

	def get_name(self,name): #获取实例变量的方法
		return self.name

	def set_name(self,name): #修改实例变量的方法
		self.name=name

	def __get_age(self): #私有方法,无法通过'实例名.私有方法名()'调用,可在本类中其他方法中被调用,不想被外面调用该方法时可用私有方法
		return self.__age

	def __call__(self): #该方法为实例调用,只能通过'实例名()'来调用该方法
		return 300

	def __len__(self): #调用该方法时可获得400,通过'len(实例名)'调用
		return 400

	def __add__(self,other): #该方法可直接将两个实例相加得到一个值,例如:a1=A(100),a2=A(200),a3=a1+a2,那么a3=300
		return self.age+other.age



	@classmethod
	def b(cls): #该方法上方加了@classmethod装饰器的,叫类方法;可以A.b()调用,也可以用实例调用;调用该方法时,系统会自动将本类的地址传入cls
		print(cls.__name__) #该方法一般用于获取类本身的一些属性,该处打印的值为A
		return 20 #该方法至少要有一个参数,一般叫cls,也可叫其他名字,该方法内不能使用实例变量

	@staticmethod
	def c(): #该方法上方加了@staticmethod装饰器的,叫静态方法;可以没有参数
		return 30 #该方法可以A.b()调用,也可以用实例调用。该方法内不能使用实例变量

	@property
	def d(self): #类的属性,定义时上方需加@property装饰器,只能设置一个参数self,调用该方法时不用加括号‘实例名.d’
		return self.__age
	@d.setter
	def d(self,value): #修改类的属性,定义时上方加‘@属性名.setter’,调用时“实例名.d=20”,就可将age的值改为20
		if value<0 or value>100:
			return "年龄超过范围"
		self.__age=value
	@d.deleter
	def d(self): #删除类的属性,定义时上方加“@属性名.deleter”,调用时“del 实例名.d”,就可将age删除
		del self.__age
#区别----用类的属性操作变量:实例名.属性名='某个值';用“set_变量名()”操作变量:实例名.set_变量名('某个值')

#用函数的方式实现实现变量的增删改查
	getattr(实例名,"变量名",100) #100表示默认值,代表未找到变量返回100
	hasattr(实例名,"变量名") #变量存在返回True,变量不存在,返回False
	setattr(实例名,"变量名",200) #将变量的值修改为200
	delattr(实例名,"变量名") #删除变量

#内置属性的用法
	实例名.__dict__ #可将获取实例中的属性:{'name': '值', '_A__age': 值}
	实例名.__doc__ #可获取类中说明性文字:'类的说明性文字可以写在这里'
	类名.__name__ #获取类的名字:'A'
	实例名.__module__ #获取所在模块的名字:'__main__'
	类名.__bases__ #获取该类的所有父类,返回元组:(<class 'object'>,)

#单例的实例化,类只能进行一次实例化的方法

class A():
	_instance = None #类变量,该变量为None时,表示未被实例化过
	def __new__(cls,*args,**kw): #cls代表将A类传入cls参数中,*args和**kw可变参数是为了A类中有多个属性时传入,给__new__()进行实例化用;a1=A(100,200,300),这种方法传参时会传入*args中,a2=A(x=100,y=200),这种方法传参时会传入**kw中
		if cls._instance is None: #表示当类未被实例化时,执行以下代码进行实例化;如果不是Nnoe,则不进行实例化,_instance的值不变
			 cls._instance=object.__new__(cls) #进行实例化
		return cls._instance #将实例化对象返回
#该类只能实例化一次,例如:a1=A(),a2=A(),那么id(a1)==id(a2),即a1和a2是同一个实例

#闭包

def add(a,b):
	return a+b
def w():
	return add
x=w()(1,2) #x的值为3;w()等价于add,后面加上(1,2),就等价于add(1,2)

def p():
	a=1
	def x():
		return a
	return x
p()() #返回a的值1,该处调用x()的同时,也会调用x()外的变量

#方法重写:将父类的方法在子类中重新实现,调用时会自动调用子类重写的方法

猜你喜欢

转载自blog.csdn.net/weixin_44123630/article/details/111996887