0
点赞
收藏
分享

微信扫一扫

Python之装饰器

Soy丶sauce 2022-04-14 阅读 119
python

文章目录

装饰器

@staticmethod(静态方法)

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

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


@property(属性)


# 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

单下划线:


__foo

双下划线:


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)


举报

相关推荐

0 条评论