码迷,mamicode.com
首页 > 其他好文 > 详细

静态属性、类方法、静态方法

时间:2020-04-24 22:13:10      阅读:80      评论:0      收藏:0      [点我收藏+]

标签:类的属性   直接   elf   必须   执行   函数名   执行函数   封装   idt   

静态属性、类方法、静态方法

1. 静态属性:在函数前加@property,将函数逻辑”封装“成数据属性,外部直接调用函数名,如同调用属性一样。这个函数是可以调用类和实例的属性的,
    静态属性的作用是把类的方法隐藏起来(可以把背后的逻辑隐藏起来),让用户感觉是在调用属性,而不是方法;

class Room:
    res = "alex"
    def __init__(self,name,owner,width,length,heigh):
        self.name = name
        self.owner = owner
        self.width = width
        self.length = length
        self.heigh = heigh
    @property #即可调用实例属性也可调用类属性
    def cal_area(self):
        #print(p1.width * p1.length,Room.res)
     return p
1.width * p1.length
p1 = Room("四合院","alex",10,10,20)
p1.cal_area
#print(Room.__dict__)#‘cal_area‘: <property object at 0x00000219606DD4F8>
print(p1.cal_area)# 使得调用函数属性和数据属性的输出也是统一了

2. 类方法:在类的方法前添加@classmethod,不需要实例化,直接调用类的该方法,可以访问类的数据属性,但是不可以访问对象的数据属性。
     @classmethod类方法是通过类里面的函数调用类本身的属性(不跟实例捆绑只和类捆绑,不用实例化)
     类方法的定义只是为了类去调用

 

class Room:
    res = "alex"
    def __init__(self,name,owner,width,length,heigh):
        self.name = name
        self.owner = owner
        self.width = width
        self.length = length
        self.heigh = heigh
    @classmethod #类方法只能调用类属性,不能调用实例属性
    def cal_area(cls):
        print(Room.res) #调用类的数据属性
#p1 = Room("四合院","alex",10,10,20) #不需要实例化
Room.cal_area()

3. 静态方法:在类的方法前加@staticmethod,该方法只是名义上的归属类管理,实例和类的属性均不可以访问,仅仅是类的工具包。
      可以理解为静态方法只是借用类的大树下的一个独立函数

 

class Room:
    res = "alex"
    def __init__(self,name,owner,width,length,heigh):
        self.name = name
        self.owner = owner
        self.width = width
        self.length = length
        self.heigh = heigh
    @staticmethod #类属性和实例属性都不可以调用
    def cal_area(x,y):
        print(x,y,)
p1 = Room("四合院","alex",10,10,20) #不需要实例化
Room.cal_area(1,2)
p1.cal_area(1,2)

 3。混合使用

class Room:
    tag = 1000

    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):
        # print(‘%s住的面积%s‘ % (self.owner, self.width * self.length))
        return self.width * self.length

    @property
    def cal_vol(self):
        return self.width * self.length * self.height

    def test(self):
        print(from test, self.name)

    @classmethod # 类方法,自动传递类到cls
    @property  # 封装, 使得函数属性的调用类似数据属性
    # def tell_info(self):
    #     print(‘----->‘,self.tag)
    def tell_info(cls):  # 不接受self了,使得不需要调用实例,直接可以用类来调用函数属性 也是只能用类调用
        print(cls)
        print(---->, cls.tag)  # Room.tag


print(Room.tag)
# Room.test()  # 报错 必须self, 和实例捆绑了
# 如何可以不绑定实例, 直接类执行函数属性
#Room.tell_info() # 报错
Room.tell_info
>>>1000

 

静态属性、类方法、静态方法

标签:类的属性   直接   elf   必须   执行   函数名   执行函数   封装   idt   

原文地址:https://www.cnblogs.com/vincent-sh/p/12769975.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
分享档案
周排行
mamicode.com排行更多图片
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!