lhl
首页
python
leetcode
产品思想
软件测试
博客 (opens new window)
github (opens new window)
首页
python
leetcode
产品思想
软件测试
博客 (opens new window)
github (opens new window)
  • python

    • Python 基础

    • Python 数据库

    • 面向对象

      • 面向对象基础
      • 继承
      • slot
      • @property
        • property
      • 多重继承
      • 枚举类
    • Python Web

    • Python 进阶

  • leetcode

  • 软件测试

  • Git

  • linux

  • 产品

  • MySql

  • docker

  • python
  • 面向对象
2023-07-18
目录

property

# property

# 简单使用

class Student:

    def get_score(self):
        return self._score

    def set_score(self, newscore):
        if not isinstance(newscore, int):
            raise ValueError('score must be integer')
        elif newscore < 0 or newscore > 100:
            raise ValueError('score must between 0 ~ 100')
        else:
            self._score = newscore


s = Student()
s.set_score(88)
print(s.get_score())
## s.set_score(10000)  ## 数字太大会报错
## 下面是使用@property改进
class Student1():

    ## getter的方法名 score
    ## @property getter
    @property
    def score(self):
        return self._score

    ## setter的方法名score
    ## @score.setter 是 setter
    @score.setter
    def score(self, newscore):
        if not isinstance(newscore, int):
            raise ValueError('score must be integer')
        elif newscore < 0 or newscore > 100:
            raise ValueError('score must between 0 ~ 100')
        else:
            self._score = newscore

s1 = Student1()
s1.score = 60
print(s1.score)
## s1.score = 1000  ## 数字太大会报错
  1. get/set 方法名是属性 score
  2. @property 是 getter, @score.setter 是 setter

# 只读属性

class Student:

    @property
    def birth(self):
        return self._birth

    @birth.setter
    def birth(self, birth):
        self._birth = birth

    @property
    def age(self):
        return 2015 - self.birth
  1. age 只有 @property 是只读属性

# 属性名和方法不要重复


class Student:
    
    @property
    def birth(self):
        return self.birth

这是因为调用s.birth时,首先转换为方法调用,在执行return self.birth时,又视为访问self的属性,于是又转换为方法调用,造成无限递归,最终导致栈溢出报错RecursionError。

# 测试

## 测试
class Screen:

    @property
    def width(self):
        return self._width

    @width.setter
    def width(self, new_wid):
        self._width = new_wid

    @property
    def height(self):
        return self._height

    @height.setter
    def height(self, new_hei):
        self._height = new_hei


    @property
    def resolution(self):
        return self._height * self._width
## 测试:
s = Screen()
s.width = 1024
s.height = 768
print('resolution =', s.resolution)
if s.resolution == 786432:
    print('测试通过!')
else:
    print('测试失败!')
slot
多重继承

← slot 多重继承→

最近更新
01
lhl learn notes
02
filter
06-09
03
decorator
06-09
更多文章>
Theme by Vdoing
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式