python面试题1:阐述以下方法@classmethod, @staticmethod, 和 @property在Python类中的用法和它们之间的区别?(难度--中等)

题目

阐述以下方法@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)
"""输出结果
<<<
张三
王五
>>>
"""
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沂水弦音

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值