Python学习第十六课——静态属性(property, classmethod, staticmethod)

计算所居住房子的面积

普通写法

class Room:
    def __init__(self,name,owner,width,length,heigh):
        self.name=name
        self.owner=owner
        self.width=width
        self.lenth=length
        self.heigh=heigh

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

r1=Room('别墅','憨憨',100,100,100)
r2=Room('大别墅','玫玫',1000,1000,1000)

r1.cal_area() # 憨憨 住的 别墅 总面积为 10000
r2.cal_area() # 玫玫 住的 大别墅 总面积为 1000000

property 写法

# property 用法
class Room:
    def __init__(self, name, owner, width, length, heigh):
        self.name = name
        self.owner = owner
        self.width = width
        self.lenth = length
        self.heigh = heigh

    @property  # 装饰器property 可以将 方法 转化为属性  在下面调用时  不需要带括号
    def cal_area(self):
        print('%s 住的 %s 总面积为 %s' % (self.owner, self.name, self.heigh * self.width))


r1 = Room('别墅', '憨憨', 100, 100, 100)
r2 = Room('大别墅', '玫玫', 1000, 1000, 1000)

r1.cal_area  # 憨憨 住的 别墅 总面积为 10000
r2.cal_area  # 玫玫 住的 大别墅 总面积为 1000000

类方法(classmethod)

class Room:

    tag=1
    def __init__(self,name,owner,width,length,heigh):
        self.name=name
        self.owner=owner
        self.width=width
        self.lenth=length
        self.heigh=heigh
    @property
    def cal_area(self,):

        return self.heigh*self.width

    def test(self,):

        print('from test',self.name)

    @classmethod  # 变为了类方法
    def tell_info(cls):
        print(cls)
        print('---->', cls.tag)


    # def tell_info(self):
    #     print('---->',self.tag)

print(Room.tag)  # 1
# r1=Room('别墅','憨憨',100,100,100)
# Room.test('测试')

#Room.tell_info(r1) # ----> 1
Room.tell_info() # ----> 1  拥有cls  就不需要实例化对象了

静态方法

class Room:

    tag=1
    def __init__(self,name,owner,width,length,heigh):
        self.name=name
        self.owner=owner
        self.width=width
        self.lenth=length
        self.heigh=heigh
    @property  # 静态属性
    def cal_area(self,):

        return self.heigh*self.width

    def test(self,):

        print('from test',self.name)

    @classmethod  # 变为了类方法
    def tell_info(cls):
        print(cls)
        print('---->', cls.tag)

    @staticmethod  # 静态方法只是名义上归属性管理,不能使用类变量和实例变量,是类的工具包
    def wash_body(a,b,c):
        print('%s %s %s 正在洗澡 '%(a,b,c))

    def test(x,y,z):
        print(x,y,z)


Room.wash_body('k','l','o') # k l o 正在洗澡
r1=Room('别墅','憨憨',100,100,100)
r1.wash_body('k','l','o') # k l o 正在洗澡


Room.test('k','l','o') # k l o
r1.test('k','l','o') # 报错了  不能这样调用  因为test 不是静态方法
静态方法

 

posted @ 2020-02-15 14:32  PY憨  阅读(225)  评论(0)    收藏  举报