python3: 实例说明classmethod/staticmethod/普通成员函数/类变量/实例变量的区别

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
学校的地址:广东省深圳市福田区

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值