Python3基础-静态属性、类方法、静态方法、
1、静态属性
类有两种属性:数据属性和函数属性
在使用实例调用类的函数属性并运行时,需要带上函数的后面括号才能运行,不然总是调用函数的内存地址,如:
class student: '学生的信息' info_stu = "打印学生的信息" empcount = 0 def __init__(self,name,sex,age): self.name= name self.sex = sex self.age = age student.empcount += 1 def info(self): print("姓名:%s, 性别:%s,年龄:%s"%(self.name,self.sex,self.age)) def displaycount(self): print("Total empcount %d"%student.empcount) stu1 = student('susu','女',29) #调用数据属性 print(stu1.name) print(stu1.sex) #调用函数属性 stu1.info() #函数后面的括号每次都必须要带上 输出:姓名:susu, 性别:女,年龄:29 print(stu1.info) #输出:<bound method student.info of <__main__.student object at 0x02C10030>>
问题:如何像调用数据函数一样调用函数属性
类中提供了@property关键字,在函数前加@property
,将函数逻辑”封装“成数据属性,外部直接调用函数名,如同调用属性一样。这个函数是可以调用对象和类的属性的。
class student: '学生的信息' info_stu = "打印学生的信息" empcount = 0 def __init__(self,name,sex,age): self.name= name self.sex = sex self.age = age student.empcount += 1 @property def info(self): print("姓名:%s, 性别:%s,年龄:%s"%(self.name,self.sex,self.age)) def displaycount(self): print("Total empcount %d"%student.empcount) stu1 = student('susu','女',29) #调用数据属性 print(stu1.name) print(stu1.sex) #调用函数属性 stu1.info #输出:姓名:susu, 性别:女,年龄:29 #stu1.info() #就会报错 TypeError: 'NoneType' object is not callable stu1.displaycount() #Total empcount 1 print(stu1.displaycount) #<bound method student.displaycount of <__main__.student object at 0x007E0030>>
2、类方法
如果要求,不进行实例化,直接调用类的函数,此时会提示缺少必要的位置参数self
class student: '学生的信息' info_stu = "打印学生的信息" empcount = 0 def __init__(self,name,sex,age): self.name= name self.sex = sex self.age = age student.empcount += 1 @property def info(self): #print("姓名:%s, 性别:%s,年龄:%s"%(self.name,self.sex,self.age)) return self.name,self.sex def displaycount(self): print("Total empcount %d"%student.empcount) student.displaycount() #TypeError: displaycount() missing 1 required positional argument: 'self'
虽然我们可以随意加上位置参数,但是注意到此处的self有特殊含义,它是指实例的本身,也就是说要使用self必须要先实例化才行
在类的方法前添加@classmethod
,不需要实例化,直接调用类的该方法。可以访问类的数据属性,但是不可以访问对象的数据属性。
class student: '学生的信息' info_stu = "打印学生的信息" empcount = 0 def __init__(self,name,sex,age): self.name= name self.sex = sex self.age = age student.empcount += 1 @property def info(self): #print("姓名:%s, 性别:%s,年龄:%s"%(self.name,self.sex,self.age)) return self.name,self.sex @classmethod def displaycount(self): print("Total empcount %d"%student.empcount) #print(self.name) 会报错,因为name是对象的数据属性,而类方法是不可以访问实例的属性 #print(self.name) AttributeError: type object 'student' has no attribute 'name' student.displaycount() #就可以直接调用成功 Total empcount 0
类的函数里面有多个形参
class student: '学生的信息' info_stu = "打印学生的信息" empcount = 0 def __init__(self,name,sex,age): self.name= name self.sex = sex self.age = age student.empcount += 1 @property def info(self): #print("姓名:%s, 性别:%s,年龄:%s"%(self.name,self.sex,self.age)) return self.name,self.sex @classmethod def displaycount(self,x): print("Total empcount %d;x===%s"%(student.empcount,x)) student.displaycount('我是x的值') #只要传入x的值就可以了
3、静态方法
class student: '学生的信息' info_stu = "打印学生的信息" empcount = 0 def __init__(self,name,sex,age): self.name= name self.sex = sex self.age = age student.empcount += 1 @property def info(self): #print("姓名:%s, 性别:%s,年龄:%s"%(self.name,self.sex,self.age)) return self.name,self.sex @classmethod def displaycount(self,x): print("Total empcount %d;x===%s"%(student.empcount,x)) def test(x,y): print("%d,%d相加的值是%d"%(x,y,x+y)) student.test(1,3) #1,3相加的值是4 stu1=student('susu','位置',18) stu1.test(1,3) #就会报错 TypeError: test() takes 2 positional arguments but 3 were given #通过实例来访问test(x,y),虽然传入的是2个参数,但是实际python自动默认首位输入了self;(传的是2个参数,收到的是3个参数)
在类的方法前加@staticmethod
,该方法只是名义上的归属类管理,实例和类的属性均不可以访问,仅仅是类的工具包
class student: '学生的信息' info_stu = "打印学生的信息" empcount = 0 def __init__(self,name,sex,age): self.name= name self.sex = sex self.age = age student.empcount += 1 @property def info(self): #print("姓名:%s, 性别:%s,年龄:%s"%(self.name,self.sex,self.age)) return self.name,self.sex @classmethod def displaycount(self,x): print("Total empcount %d;x===%s"%(student.empcount,x)) @staticmethod def test(x,y): print("%d,%d相加的值是%d"%(x,y,x+y)) print("类的属性",student.info_stu) #可以正常访问类的数据属性 #print("实例的属性",self.name) #会报错,因为test()没有self 传入 NameError: name 'self' is not defined student.test(1,3) #1,3相加的值是4 类的属性 打印学生的信息 stu1=student('susu','位置',18) stu1.test(3,3) #3,3相加的值是6 类的属性 打印学生的信