python开发基础----类 (静态属性、类方法、静态方法)
静态属性
我们知道类既有函数属性又有数据属性,实例只有数据属性,我们在使用实例调用类的函数属性并运行时,总要带上函数后面的括号才能运行,不然总是调用函数的内存地址,那么我们如何能像调用数据属性一样调用函数属性呢?
类中提供了@property关键字,可以看成@property是一个装饰器,装饰器的作用是调用类的函数属性key值时,直接来运行该key值对应的函数。像是调用类的属性一样来直接调用并运行类的函数,具体操作如:
class Room:
    def __init__(self,name,owern,width,length,height):
        self.name = name
        self.owern = owern
        self.width = width
        self.length = length
        self.height = height
    @property  # 将函数封装为静态属性
    def cal_area(self):
        return self.width * self.length
    @property
    def cal_tiji(self):
        return  self.width * self.height * self.length
p1 = Room('厕所','alex',100,100,100)
print(p1.cal_area) #调用的方法跟调用属性的方法一样
print(p1.cal_tiji)
注意,当类中的函数有其他参数时(非self),加上@property关键字会报错,提示缺少必要的位置参数,猜想应该是装饰的问题,可能需要自定义装饰器才行。可以判断,@property的作用是:直接运行被装饰的函数,不能带参数,表面上看就是在被装饰的函数后面直接加括号。
类方法:专门给类用的方法
如果要求,不进行实例化,直接调用类的函数,此时会提示缺少必要的位置参数self,虽然我们可以随意加上位置参数,但是注意到此处的self有特殊含义,它是指实例的本身,也就是说要使用self必须要先实例化才行。为了解决这个问题,我们引入另一个@classmethod装饰器后,就可以直接通过类来调用类的函数属性了(该函数带类的数据属性参数),如下:
class Room:
    x = 1
    def __init__(self,name,owern,width,length,height):
            self.name = name
            self.owern = owern
            self.width = width
            self.length = length
            self.height = height
#     def tell_info(self):
#         print("--->",self.x)
#
# p1 = Room('厕所','alex',100,100,100)
# Room.tell_info(p1) #上面用类去调用函数,得传递一个实例参数
    @classmethod
    def tell_info(cls):
        print("--->", cls.x)
        
Room.tell_info()  #加上classmethod之后变为了类方法,可以用类直接调用,不用加参数
静态方法:(只是名义上属于类管理,不能使用类变量和实例变量,叫做类的工具包,不跟类绑定也不跟实例绑定)
如果要求:在类中定义一个函数,要求该函数中的位置函数与实例无关,与所在的类本身也无关。为了解决该问题,现引入了@staticmethod
class Room:
    x = 1
    def __init__(self,name,owern,width,length,height):
            self.name = name
            self.owern = owern
            self.width = width
            self.length = length
            self.height = height
    @staticmethod
    def test(a,b):
        print(" %s x %s = %s"%(a,b,int(a) * int(b)))
Room.test(10,2)
p1 = Room('厕所','alex',100,100,100)
p1.test(20,2)
结果:
 10 x 2 = 20
 20 x 2 = 40
可以看出,虽然test方法与实例无关,与类本身也无关,但是却可以通过实例和类来调用它,却使用实例调用它是不会传入实例本身的位置参数(在正常类方法中,实例化类后,实例在调用它时,会自动默认首先传入实例本身即self),如果直接定义函数不加@staticmethod装饰器,相当于只跟类绑定,跟实例无关,因为实例默认会把本身传给函数的第一个参数,注意:静态方法中不能调类属性和方法,也不能调用实例变量,只是类的工具包。因为没有self,也就不能指类本身或实例本身,从而不能调用相应的类属性和类方法。
总结:
静态属性:在函数前加@property,将函数逻辑”封装“成数据属性,外部直接调用函数名,如同调用属性一样。这个函数是可以调用对象(self)和类(cls)的属性的。
类方法: classmethod只能类访问类方法,不能用实例访问类方法
静态方法:staticmethod 用类可以调用静态方法,实例也可以调用静态方法,不跟类和实例绑定,只叫类的工具包
                    
                
                
            
        
浙公网安备 33010602011771号