静态属性,类方法,静态方法

静态属性
静态属性就是将类中的函数封装,实现像调用数据属性一样的方式调用函数属性,在python中利用@property语句实现

封装的概念:使得调用者无法察觉到被调用对象的实现逻辑,就是对象的封装

#不利用@property的方式
class Room:
    def __init__(self, name, owner, width, length, height):
        self.name = name
        self.owner = owner
        self.width = width
        self.length = length
        self.height = height

    def cal_area(self):
        print("%s住的%s,面积为%s" % (self.owner, self.name, self.width * self.length))


R1 = Room("公寓", "MB", 100, 100, 100)
R1.cal_area()#这里可以被看出调用的是一个函数属性
#利用@property的方式
class Room:
    def __init__(self, name, owner, width, length, height):
        self.name = name
        self.owner = owner
        self.width = width
        self.length = length
        self.height = height

    @property
    def cal_area(self):
        return self.width * self.length #注意为了实现和数据属性相同的调用方式,需要加入return值


R1 = Room("公寓", "MB", 100, 100, 100)
print(R1.name)
print(R1.cal_area)#这里函数属性的调用已经完全和数据属性相同了

类方法
用在需要类中的函数不和实例捆绑时,即不通过实例去调用类的某个函数(函数末尾有self参数,就说明了这个函数和实例绑定。有cls参数,就说明和类绑定)
利用@classmethod语句,将某个属性只和类绑定而不和实例绑定

#不利用@classmethod的方法
class Room:
    tag = 1

    def __init__(self, name, owner, width, length, height):
        self.name = name
        self.owner = owner
        self.width = width
        self.length = length
        self.height = height


R1 = Room("公寓", "MB", 100, 100, 100)
print(R1.tag)#想得出这个tag,需要产生一个实例并调用它的tag属性
#利用@classmethod的方法
class Room:
    tag = 1

    def __init__(self, name, owner, width, length, height):
        self.name = name
        self.owner = owner
        self.width = width
        self.length = length
        self.height = height

    @classmethod
    def tell_info(cls):
        print(cls.tag)


R1 = Room("公寓", "MB", 100, 100, 100)
Room.tell_info()#python会自动将Room传给cls参数

通过@classmethod定义过的方法就是给类用的,R1.tell_info()虽然也可以运行,但是不规范(相当于R1将自己所属的类传入了cls)


静态方法
静态方法只是名义上归属类管理,通过类和实例都可以调用,即这个属性既不和实例绑定也不和类绑定,叫做类的工具包

通过@staticmethod语句,实现类的静态方法

class Room:

    def __init__(self, name, owner, width, length, height):
        self.name = name
        self.owner = owner
        self.width = width
        self.length = length
        self.height = height

    @staticmethod
    def take_shower(name1, name2, name3):
        print("%s,%s,%s is taking shower together" % (name1, name2, name3))


R1 = Room("公寓", "MB", 100, 100, 100)
Room.take_shower("CJJ", "MB", "LGJ")#通过类可以调用
R1.take_shower("CJJ", "MB", "LGJ")#通过实例可以调用

如果不写@staticmethod,例如def test():
这个函数只能通过类调用,不能实例调用


总结
静态属性:即可以访问实例属性,也可以访问类属性
类方法:可以访问类属性,不能访问实例属性
静态方法:不能访问类属性也不能访问实例属性

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值