Python之装饰器

装饰器

@staticmethod(静态方法)

如果需要不调用类而直接调用类的成员方法,一般会使用类静态方法@staticmethod,加了这个修饰器后,可以不用传递self参数,也可以在类不进行实例化的情况下调用。

@staticmethod 静态方法只是名义上归属类管理,但是不能使用类变量和实例变量,是类的工具包
放在函数前(该函数不传入self或者cls),所以不能访问类属性和实例属性

class Time():
    def __init__(self,sec):
        self.sec = sec
    #声明一个静态方法
    @staticmethod
    def sec_minutes(s1,s2):
        #返回两个时间差
        return abs(s1-s2)

t = Time(10)
#分别使用类名调用和使用实例调用静态方法
print(Time.sec_minutes(10,5),t.sec_minutes(t.sec,5))
#结果为5 5

@classmethod(类方法)

类方法让类模板具有记忆力
在普通情况下,不使用类方法对类进行实例化,类本身是不具有记忆性的。只是当一个静态模板被套用多次而已。

class Person:
    cnt = 0 # 类变量
    def __init__(self, name):
        self.name = name
        cnt = self.create()
    @classmethod
    def create(cls):
        cls.cnt += 1
        return cls.cnt
a = Person('A')
print(a.cnt)
b = Person('B')
print(b.cnt)
1
2

我对Person类进行了两次实例化,每次计数变量++,利用类方法实现:
@classmethod描述类方法,然后用"cls"代表本类。
类方法对类属性进行的处理是有记忆性的。

类方法处理的变量一定要是类变量
因为在类方法中用不了self来寻址实例变量,所以需要把类变量放到最前面描述


@property(属性)

property 是 Python 内置的功能,常用来修饰类方法,用于已访问属性的方式调用函数。


# http://c.biancheng.net/view/4561.html (@property的讲解)
class rect:
    def __init__(self, area):
        self.__area = area
    @property
    def getarea(self):
        return self.__area
    
    @getarea.setter
    def getarea(self, val):
        self.__area = val
    
    @getarea.getter
    def getarea(self):
        return self.__area
    
    @getarea.deleter
    def getarea(self):
        self.__area = -1
    
r = rect(23)
print(r.getarea)
r.getarea = 20
print(r.getarea)
del r.getarea
print(r.getarea)
23
20
-1

访问限制

_foo

单下划线:

表示 (protected)保护类型成员,只允许类本身和子类进行访问


__foo

双下划线:

表示 (private)私有类型成员,只允许定义该方法的类本身进行访问,而且不能通过类的实例进行访问,但是可以通过“类的实例名.类名__xxx”方式访问


__foo __

首尾双下划线:

表示定义的特殊方法,一般是系统定义的名字


属性(@property)

通过@property(装饰器)将一个方法转换为属性,从而实现用于计算的属性。可直接通过方法名来访问方法。


添加安全保护机制

python默认情况下,创建的类属性或者实例是可以在类体外进行修改的(动态的),如果要限制不在类体外修改,则可将其设置为私有的,但这样在类体外不能获取它的值。
@property:可以实现创建一个可以读取但不能修改的属性

想要实现修改属性,需要给属性添加 setter 方法,即 setter 装饰器(@方法名.setter)

class test:
    def __init__(self, a):
        self.__a = a
    @property
    # @property 修饰 get方法, 使得该方法变成get属性的getter方法
    def get(self):
        return self.__a

如下,则size属性变为了可读、可修改的属性。

class A:
    def __init__(self, x):
        self.__x = x
    @property
    def size(self):
        return self.__x
    @size.setter
    def size(self, value):
        self.__x = value

python的class(类)中的object是什么意思?

继承object对象的话就拥有了好多可操作对象,这些都是类中的高级特性。

class A:
    x = 1
class B(object):
    x = 1
print ("A", "['__doc__', '__module__', 'name']")
print ("B", dir(B))

我环境python3的,所以在此只做演示

A ['__doc__', '__module__', 'name']
B ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'x']

实际上在python 3 中已经默认加载了object(即便没有写上object)


  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ღCauchyོꦿ࿐

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

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

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

打赏作者

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

抵扣说明:

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

余额充值