python @property、@.setter
函数作为参数
b站:Python中各种@property、@xxx.setter、@classmethod、@staticmethod 都是些啥啊?
函数作为参数,可以传入函数,但是没写return的话,就会变成返回NoneType
举例:
1 | def say(): |
但是由于func_1没有return,当执行的函数赋给一个变量时,比如:
1 | my_func = func_1(say) |
由于没有return,这个变量是一个NoneType类的对象。
my_func = func_1(say)
这句话,我们希望的是拿到函数的引用,然后去用这个变量做其它事情,执行其它代码。
如何使得这个变量也是一个函数呢?!通过 定义内部方法,然后返回这个引用!
1 | def func_1(func): |
因此,这里 func_1 是为了改变、优化传入进来的函数的执行结果。
内部的inner_func通常名字叫“wrapper”
Python中的@property、@xxx.setter
廖雪峰:使用@property
举例,一个检查分数,返回分数的函数:
1 | class Student(object): |
用@后面添加一个要进行额外操作的方法名称。
能检查参数,又可以用类似属性这样简单的方式来访问类的变量。
Python内置的@property
装饰器就是负责把一个方法变成属性调用的:
1 | class Student(object): |
@property
的实现比较复杂,我们先考察如何使用。把一个getter方法变成属性,只需要加上@property
就可以了,此时,@property
本身又创建了另一个装饰器@score.setter
,负责把一个setter方法变成属性赋值,于是,我们就拥有一个可控的属性操作:
1 | s = Student() |
注意到这个神奇的@property
,我们在对实例属性操作的时候,就知道该属性很可能不是直接暴露的,而是通过getter和setter方法来实现的。
chatgpt的回答:
Python 中的 property
是一个内置装饰器,它可以把一个类中的方法设置为属性的读取/设置/删除方法。
使用方法如下:
定义 getter 方法,返回需要作为属性读取的值。
1
2
3
4
5
6class Example:
def __init__(self, value):
self._value = value
def get_value(self):
return self._value在 getter 方法上使用 @property 装饰器,将其标记为属性。
1
2
3
4
5
6
7class Example:
def __init__(self, value):
self._value = value
def value(self):
return self._value如果需要为属性提供写入操作,可以定义一个 setter 方法,并在该方法上使用 @property 名称的 setter 装饰器。
1
2
3
4
5
6
7
8
9
10
11class Example:
def __init__(self, value):
self._value = value
def value(self):
return self._value
def value(self, value):
self._value = value如果需要为属性提供删除操作,可以定义一个 deleter 方法,并在该方法上使用 @property 名称的 deleter 装饰器。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15class Example:
def __init__(self, value):
self._value = value
def value(self):
return self._value
def value(self, value):
self._value = value
def value(self):
del self._value
然后,你可以使用如下语句来读取、写入和删除属性值:
1 | example = Example(10) |
b站:Python中各种@property、@xxx.setter、@classmethod、@staticmethod 都是些啥啊? 说得不好
1 | class User: |
@property和@.setter搭配使用