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

插个眼!转载自这个博客

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

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

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

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

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

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

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

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

import time
class 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.open
time1 = time.strftime(’%Y-%m-%d %H:%M:%S’,time.localtime())

door1.off(time1) #传参无效,应该要自定义对应的装饰器才行

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

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

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

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

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

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

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

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

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

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

我们可以看出,如果直接在类中定义一个常规方法(不含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’, ‘木门’)
#调用静态方法test
Door.test(1,3)
door1.test(2,5)
#调用常规方法test1
Door.test1(1,3)
door1.test1(2,5)
注意:静态方法中不能调类属性和方法,也不能调用实例变量,只是类的工具包。因为没有self,也就不能指类本身或实例本身,从而不能调用相应的类属性和类方法。

你可能感兴趣的:(Python)