Python_静态属性、类方法、静态方法,,1.静态属性我们知道


1.静态属性
我们知道类既有函数属性又有数据属性,实例只有数据属性,我们在使用实例调用类的函数属性并运行时,总要带上函数后面的括号才能运行,不然总是调用函数的内存地址,如下图所示:

技术分享图片

问题:那么我们如何能像调用数据属性一样调用函数属性呢?

类中提供了@property关键字,可以看成@property是一个装饰器,装饰器的作用是调用类的函数属性key值时,直接来运行该key值对应的函数。像是调用类的属性一样来直接调用并运行类的函数,具体操作如:
1.1加上@property关键字后,类的函数属性的不同之处:

技术分享图片

1.2加上@property关键字后,实例调用类的函数属性:

技术分享图片

注意,当类中的函数有其他参数时(非self),加上@property关键字会报错,提示缺少必要的位置参数,猜想应该是装饰的问题,可能需要自定义装饰器才行。可以判断,@property的作用是:直接运行被装饰的函数,不能带参数,表面上看就是在被装饰的函数后面直接加括号。
该部分的代码块为:

import timeclass Door():    "门的类"    address = "浙江省杭州市"    def __init__(self,size,color,type):#构造函数        "初始化门的数据"        self.size = size        self.color = color        self.type = type    @property    def open(self):        "门打开的方法"        print("这个%s门打开了" %self.type)    @property    def off(self,time):        "门关闭的方法"        print("这个%s门关闭了,时间为;%s" %(self.type,time))door1 = Door(16, ‘red‘, ‘木门‘)#调用数据属性print(door1.size)print(door1.address)#调用函数属性# door1.open()    #函数后面的括号每次都必须要带上#实例调用类的静态属性print(Door.__dict__)door1.opentime1 = time.strftime(‘%Y-%m-%d %H:%M:%S‘,time.localtime())# door1.off(time1)    #传参无效,应该要自定义对应的装饰器才行

2.类方法
如果要求,不进行实例化,直接调用类的函数,此时会提示缺少必要的位置参数self,如下图:

技术分享图片

我们加上位置参数后,如下图:

技术分享图片

虽然我们可以随意加上位置参数,但是注意到此处的self有特殊含义,它是指实例的本身,也就是说要使用self必须要先实例化才行。为了解决这个问题,我们引入另一个@classmethod装饰器后,就可以直接通过类来调用类的函数属性了(该函数带类的数据属性参数),如下图所示:

技术分享图片

3.静态方法
如果要求:在类中定义一个函数,要求该函数中的位置函数与实例无关,与所在的类本身也无关。为了解决该问题,现引入了@staticmethod,操作如下图所示:

技术分享图片

可以看出,虽然test方法与实例无关,与类本身也无关,但是却可以通过实例和类来调用它,却使用实例调用它是不会传入实例本身的位置参数(在正常类方法中,实例化类后,实例在调用它时,会自动默认首先传入实例本身即self)。
到了此处可能有人问,为什么不能直接在类中定义一个函数,不传self形参?按照上面的提议是否能满足实例可以调用,类本身也可以调用的要求呢?详见下图:

技术分享图片

我们可以看出,如果直接在类中定义一个常规方法(不含self的形参),通过类本身访问它,但是通过实例来访问它时虽然也是传入2个参数,但是实际行python自动默认首位传入了self,这样就造成了上面的情况了(传的是2个参数,收到的是3个参数)
该部分代码块如下:

class Door():    "门的类"    address = "浙江省杭州市"    def __init__(self,size,color,type):#构造函数        "初始化门的数据"        self.size = size        self.color = color        self.type = type    def open(self):        "门打开的方法"        print("这个%s门打开了" %self.type)    def off(self,time):        "门关闭的方法"        print("这个%s门关闭了,时间为;%s" %(self.type,time))    @staticmethod    def test(x,y):        print("%s,%s的乘积为:%s"%(x,y,x*y))    def test1(x,y):        print("%s,%s的乘积为:%s"%(x,y,x*y))door1 = Door(16, ‘red‘, ‘木门‘)#调用静态方法testDoor.test(1,3)door1.test(2,5)#调用常规方法test1Door.test1(1,3)door1.test1(2,5)

注意:静态方法中不能调类属性和方法,也不能调用实例变量,只是类的工具包。因为没有self,也就不能指类本身或实例本身,从而不能调用相应的类属性和类方法。

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

评论关闭