python:类属性、类方法与静态方法
Python:类属性与静态方法
一、类属性
在面向对象中,属性一般可以分为两种形式:① 对象属性(成员属性) ② 类属性
在python代码中,一切皆对象,类也可以是一种特殊的对象,所以我们也可以为类创建一个属性 =>类属性
那么类属性和成员属性有什么区别呢
对象属性(成员属性)是有这个类产生的对象所拥有的属性
类属性:并不是由实例化对象拥有的,而是这个类所拥有的属性,可以理解为所有对象共同拥有的属性,但是其不属于某一个对象。
定义:类属性并不是某个对象所拥有的,而是所有对象所共同组成的一个特征,我们就可以定义为类属性。
定义类属性:
class 类名称():
属性名 = 属性值 # 在类内部,函数外部定义
# 类属性的访问:既可以在类的内部访问,也可以在类的外部访问
类名.属性名
对象.属性名 (不推荐)
应用案例:我们想知道这个类产生了多少个对象,定义一个类属性来统计:
class Person(object):
# 定义一个类属性来计算这个类实例化了多少个对象
count = 0
# 通过init魔术方法定义的都是对象属性
def __init__(self, name, age):
self.name = name
self.age = age
Person.count += 1 # 每次初始化都会调用init方法
p1 = Person('七落', 20)
p1 = Person('莫航', 19)
print(Person.count) # 2
二、类方法
在Python代码中,类属性与对象属性一样,都强调封装特性,不建议直接在类的外部直接对类属性进行操作。
如果想要在类的外部获取类属性的信息,必须使用类方法来实现。
基本语法:
class 类名:
类属性名 = 属性值
@ classmethod # 装饰器
def 类方法(cls):
# 因为这个方法属于类方法,cls代表类方法本身
# 类方法的调用
类名.类方法()
对象名.类方法() # 不推荐
应用案例:统计Tool类实例化了多少个对象。
class Tool(object):
# 定义类属性
count = 0
def __init__(self, name):
self.name = name
Tool.count += 1
# 定义一个类方法
@classmethod
def get_count(cls): # cls 代表这个类本身,或者cls指向这个类
return f'这个Tool类实例化了{cls.count}个工具!'
p1 = Tool('斧头')
p2 = Tool('锯子')
print(Tool.get_count())
三、静态方法
在开发时候,如果需要在类中封装一个方法,这个方法
① 既不需要访问实例属性或调用实例方法
② 也不需要访问类属性或调用类方法
这个时候可以把这个方法封装为静态方法
基本语法:
class 类名:
@ staticmethod
def 静态方法名():
pass
# 由于静态方法本身就是一个独立的功能,既不需要调用自身的属性,也不需要调用自身方法,所以其没有参数
# 访问
类名.静态方法名()
对象.静态方法名()
class StudentManage(object):
# 打印一个系统菜单
@staticmethod
def menu():
print('=' * 40)
print('欢迎使用学生管理系统!')
print('【1】添加学生信息')
print('【2】删除学生信息')
print('【3】修改学生信息')
print('【4】查看学生信息')
print('【5】退出系统')
print('=' * 40)
StudentManage.menu()