Python学习(十)--类方法、静态方法
2020-03-20 本文已影响0人
白面葫芦娃92
1.如何创建一个类方法
class Student():
sum = 0
def __init__(self, name1, age):
self.name = name1
self.age = age
@classmethod
def plus_sum(cls):
pass
函数上方加上@classmethod,()里默认参数为cls,这样就成为了一个类方法
2.怎么使用类方法
上一篇Python学习(九)降到了用类变量来统计实例数量,当时计数语句放在了实例方法里,这样使用不是很合适,按道理不应该在实例方法里操作类变量。下面演示一下放在类方法里实现:
class Student():
sum = 0
def __init__(self, name1, age):
self.name = name1
self.age = age
@classmethod
def plus_sum(cls):
cls.sum += 1
print('当前班级学生总数为:' + str(cls.sum))
if __name__ == "__main__":
student1 = Student('小明',18)
Student.plus_sum()
student2 = Student('小红',17)
Student.plus_sum()
student3 = Student('小鱼',19)
Student.plus_sum()
student4 = Student('小鹿',20)
Student.plus_sum()
student5 = Student('小凯',17)
Student.plus_sum()
运行结果
当前班级学生总数为:1
当前班级学生总数为:2
当前班级学生总数为:3
当前班级学生总数为:4
当前班级学生总数为:5
对象可以使用类方法吗?是可以的,但是不推荐,逻辑上说不通
if __name__ == "__main__":
student1 = Student('小明',18)
student1.plus_sum()
运行结果
当前班级学生总数为:1
3.静态方法
class Student():
sum = 0
def __init__(self, name, age):
self.name = name
self.age = age
@classmethod
def plus_sum(cls):
cls.sum += 1
print('当前班级学生总数为:' + str(cls.sum))
@staticmethod
def add(x, y):
print('This is a static method')
if __name__ == "__main__":
student1 = Student('小明',18)
student1.add(1,2)
Student.add(1,2)
函数上方加上@staticmethod,就成为了一个静态方法
类和对象都可以调用静态方法
运行结果:
This is a static method
This is a static method
静态方法内也可以调用类变量
思考一个问题,类方法和静态方法能不能访问实例变量?试验一下
class Student():
sum = 0
def __init__(self, name, age):
self.name = name
self.age = age
@classmethod
def plus_sum(cls):
cls.sum += 1
# print('当前班级学生总数为:' + str(cls.sum))
print('This is a class method')
print(self.name)
@staticmethod
def add(x, y):
print('This is a static method')
print(self.name)
if __name__ == "__main__":
student1 = Student('小明',18)
student1.add(1,2)
Student.add(1,2)
student1.plus_sum()
Student.plus_sum()
运行结果
This is a static method
Traceback (most recent call last):
File "c1.py", line 82, in <module>
student1.add(1,2)
File "c1.py", line 78, in add
print(self.name)
NameError: name 'self' is not defined
可见静态方法和类方法都不能访问实例变量
静态方法可以用类方法来代替,不推荐使用,因为它和普通函数几乎没什么区别,和类关联性不大