题目
阐述以下方法@classmethod, @staticmethod, 和 @property在Python类中的用法和它们之间的区别?
回答
1、@classmethod
@classmethod是装饰器的内置方法,其作用是声明一个方法是类方法,不用调用实例对象就可以调用该方法,其用法为类.方法名,参数为cls等同于self
class A():
@classmethod
def classMethod(cls):
print('我是classmethod')
A.classMethod()
#输出结果为我是classmethod
2、@staticmethod
@staticmethod同样是装饰器内置方法之一,其作用是声明该方法为一个静态方法,并且默认没有参数可以直接调用。用法为类.方法
class A():
@classmethod
def classMethod(cls):
print('我是classmethod')
@staticmethod
def staticMethod():
print('我是staticMethod')
A.classMethod()
A.staticMethod()
#输出结果为我是classmethod
3、@classmethod和@staticmethod的细微差别
通过以上的实例,我们可以发现@classmethod和@staticmethod都可以不通过创建实例对象直接调用方法,但是staticmethod因为没有参数所以无法直接调用类属性,除非使用类名.属性,而classmethod可以通过cls调用调用属性,但是classmethod和@staticmethod都无法直接反问__init__()中的参数,可以参考如下的实例:
class A():
__pwd=123456
def __init__(self):
self.tl='我是普通调用'
@classmethod
def classMethod(cls):
print( cls.__pwd)#通过cls参数调用,无法访问__init__()内的参数
@staticmethod
def staticMethod():
print(A.__pwd) #只能通过类名属性调用,无法访问__init__()内的参数
def normalMethod(self):
print(self. __pwd) #普通方法调用属性
print(self.tl)#普通方法调用__init__中的属性
A.classMethod()
A.staticMethod()
A().normalMethod()
4、@property
@property也是装饰器的内置方法,其作用是将类的方法转变为只读的类属性,重新实现属性的getter和setter,示例如下:
class A():
__name = '张三'
@property
def propertyMethod(self):
return self.__name
@propertyMethod.setter
def propertyMethod(self, name):
self.__name = name
@propertyMethod.getter
def propertyMethod(self):
return self.__name
def normalMethod(self):
print('这是普通方法')
# 示例一 转化为类属性进行调用
print(A().propertyMethod)
A().normalMethod()
"""输出结果
<<<
张三
这是普通方法
>>>
"""
# 示例二 setter和getter的用法的用法
A=A()
# 访问
print(A.propertyMethod)
# setter修改
A.propertyMethod = '王五'
# getter获取
print(A.propertyMethod)
"""输出结果
<<<
张三
王五
>>>
"""