day12 静态方法,类方法和属性方法

静态方法,类方法和属性方法

静态方法

  • 通过装饰器@staticmethod来让类中的方法变成静态方法
  • 当name函数变为静态方法时,此时静态方法将name函数与类class之间的关联截断,之前调用类下面的方法会自动传self,如果用了staticmethod,那么就可以无视这个self,而将这个方法当成一个普通的函数使用。
  • 静态方法名义上归类管理,实际中在静态方法中无法访问类和实例中的任何属性
class test:
    a='asd'
    def __init__(self):
        self.name='tom'
    def name1(self):
        print(self.name)
    @staticmethod
    def name2(self):
        print(self.name)
test1=test()
test1.name1()
test1.name2()

#tom
#TypeError: name2() missing 1 required positional argument: 'self'

使用情境

  • 取消不需要的参数传递,有利于 减少不必要的内存占用和性能消耗
  • 如果在类外面写一个同样的函数来做这些事,打乱了逻辑关系,导致代码维护困难,使用静态方法。

类方法

  • 引入了**@classmethod**来让类中的方法变成类方法
  • 类方法只能调用类属性而不能调用实例方法
class test:
    a='asd'
    def __init__(self):
        self.name='tom'
    def name1(self):
        print(self.name)
    @classmethod
    def name2(cla):
        print(cla.a)
    @classmethod
    def name3(self):
        print(self.name)

test1=test()
test1.name1()
test1.name2()
test1.name3()

#tom
#asd
#AttributeError: type object 'test' has no attribute 'name'

属性方法

  • 引入了**@property**来让类中的方法变成属性方法

  • 属性方法是把一个方法变为静态属性,调用时不能有(),否则会报错

  • 如下面这样,通过属性方法返回类的某个私有属性的话,只可以获得该属性的值,从而防止外部对该属性的修改以此提高了安全性

class test:
    a='asd'
    def __init__(self):
        self.__name='tom'
    @property
    def name3(self):    #此时test.name3 已经是test类内的一个属性
        return self.__name

test1=test()
print(test1.__name3)
print(test1.name3())

#tom
#TypeError: 'str' object is not callable

关于property类

  • 通过property类传入了某个私有对象的操作方法之后,生成新的共有属性,外部可以通过该共有属性对私有属性进行操作
class test:
    a='asd'
    def __init__(self):
        self.__name='tom'
    def getname(self):
        return self.__name
    def setname(self,name):
        self.__name=name
    name = property(getname,setname)
test1=test()
test1.name='asd'
print(test1.name)

#asd

注意:

1.使用@property装饰时,只能装饰获取属性的方法

2.@property装饰属性时,set/get方法不需要在属性名前加set和get,直接写属性名即可

3.如果一个属性有set/get方法存在,那么要先实现@property对获取方法的定义,再实现设置方法的定义,定义set方法时使用 @xxx.setter装饰,xxx要和获取方法名保持一致。如:上面的person获取方法被@property装饰,person设置方法被 @person.setter装饰

class test:
    a='asd'
    def __init__(self):
        self.name='tom'

    @property
    def name3(self):
        return self.name

    @name3.setter
    def name3(self, name):
        self.name=name

test1=test()
print(test1.name3)
test1.name3="tom2"
print(test1.name3)

#tom
#tom2
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值