用装饰器定义name的get和set方法
时间: 2024-01-21 07:17:39 浏览: 19
可以使用装饰器 `@property` 来定义 getter 方法,使用装饰器 `@name.setter` 来定义 setter 方法,具体实现如下:
```python
class Person:
def __init__(self, name):
self._name = name
@property
def name(self):
return self._name
@name.setter
def name(self, value):
self._name = value
```
这样,我们就可以通过 `person.name` 获取 `name` 属性的值,通过 `person.name = 'Jack'` 设置 `name` 属性的值了。注意,在上面的代码中,我们使用了 `_name` 来存储 `name` 属性的值,这是一种 Python 中的约定,表示该属性是私有的,不应该被直接访问。
相关问题
ts 装饰器的access
TS 装饰器的 `access` 是一个访问器装饰器,用于修饰类中的 getter 和 setter 方法。它可以接收三个参数:`target`、`propertyKey` 和 `descriptor`,分别表示装饰的目标类、属性名和属性描述符。
当我们使用 `access` 装饰器修饰一个 getter 或 setter 方法时,它会在运行时自动调用,并将目标类的实例、属性名和属性描述符作为参数传入。我们可以在装饰器函数中对这些参数进行处理,从而实现一些特定的功能,比如对属性进行拦截、修改或验证等。
下面是一个使用 `access` 装饰器的示例:
```typescript
class Person {
private _name: string;
constructor(name: string) {
this._name = name;
}
@access
get name() {
return this._name;
}
@access
set name(value: string) {
this._name = value;
}
}
function access(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
console.log(`Accessing ${propertyKey} of ${target.constructor.name}`);
console.log(`Descriptor:`, descriptor);
}
```
在上面的示例中,我们定义了一个 `Person` 类,并使用 `access` 装饰器修饰了它的 `name` 属性的 getter 和 setter 方法。当我们创建一个 `Person` 实例并访问它的 `name` 属性时,装饰器函数会自动调用,并输出一些信息。
用装饰器的两种完成以下封装: 定义一个Student类,包括name和scroe 属性,其中scroe为私有属性,利用装饰@property获取学生的成绩、利用@score.setter装饰修改学生成绩,并且要约定成绩范围在score<0or score>100。并测试
第一种装饰器实现:
```python
class Student:
def __init__(self, name, score):
self.name = name
self._score = score
@property
def score(self):
return self._score
@score.setter
def score(self, value):
if value < 0 or value > 100:
raise ValueError('成绩范围应该在0~100之间')
self._score = value
stu = Student('张三', 90)
print(stu.score)
stu.score = 120 # 抛出异常,成绩范围应该在0~100之间
```
第二种装饰器实现:
```python
class Student:
def __init__(self, name, score):
self.name = name
self.set_score(score)
def get_score(self):
return self._score
def set_score(self, value):
if value < 0 or value > 100:
raise ValueError('成绩范围应该在0~100之间')
self._score = value
score = property(get_score, set_score)
stu = Student('张三', 90)
print(stu.score)
stu.score = 120 # 抛出异常,成绩范围应该在0~100之间
```