class Student():
# 类成员变量, 所有实例共享
province = '广东省'
city = '深圳市'
district = '宝安区'
stu_num = 0
def __init__(self, name, sex, **kw):
# 实例成员变量, 每个实例独立
self.name = name
self.sex = sex
self.other = kw
# 每实例化一个Stu,学生总数就会增加1
Student.stu_num += 1
def __str__(self):
return f'地址:{Student.province + Student.city + Student.district} {self.name} {self.sex} {self.other} \n学生数:{Student.stu_num}'
# 带classmethod装饰器的函数为类成员函数,该函数可修改类成员变量,注意,其首参为cls
# 在类成员变量中有两种调用类成员的方式
# 1. cls.类成变变量
# 2. 类名.类成名变量
@classmethod
def modify_addr(cls, addr):
# Student.district = addr
cls.district = addr
# print(f'学校搬至了新地址:{Student.province + Student.city + Student.district}')
print(f'学校搬至了新地址:{cls.province + cls.city + cls.district}')
# 带staticmethod装饰器的函数本质上为一个普通函数,他不需要带self或cls参数。
# 它与一般的普通函数的区别在于他只能被当前类的实例调用
@staticmethod
def addr_detail():
return f'学校的地址:{Student.province + Student.city + Student.district}'
def main():
stu1 = Student('Jacky', '男', age = 28, fan = '爬山')
stu2 = Student('Elwin', '男', age = 26, fan = '登山')
print(stu1)
stu1.modify_addr('福田区')
print(stu2)
print(stu2.addr_detail())
# 直接访问实列属性
print(stu1.name)
# 直接访问类属性
print(Student.province)
if __name__ == '__main__':
main()
运行后的结果为:
地址:广东省深圳市宝安区 Jacky 男 {'age': 28, 'fan': '爬山'}
学生数:2
学校搬至了新地址:广东省深圳市福田区
地址:广东省深圳市福田区 Elwin 男 {'age': 26, 'fan': '登山'}
学生数:2
学校的地址:广东省深圳市福田区