石头han 2021-12-19 14:35 采纳率: 100%
浏览 32
已结题

自定义类实例化时怎样优雅的对属性赋值进行控制

如下这段python代码,自定义类Student用到了property装饰器。
很明显,我想要的效果是年龄大于等于18岁即不能设置,打印“输入的年龄不合法”的提示信息

class Student:
    def __init__(self,age):
        self.__age=age
        # if isinstance(age, int) and age < 18:
        #     self.__age = age
        # else:
        #     print('输入的年龄不合法')

    @property
    def age(self):
        return self.__age

    @age.setter
    def age(self,age):
        if isinstance(age,int) and age<18:
            self.__age=age
        else:
            print('输入的年龄不合法')

s1=Student(30)
print(s1.age)
s1.age=20

运行结果为:


30
输入的年龄不合法

使用s1.age=20进行赋值,可以按照预设调用setter,完成控制赋值。
但问题在于s1=Student(30),其构造函数中没有控制语句,所以在实例化时就不能起到控制作用。难道我要在构造函数中重复的写一遍if isinstance(age,int) and age<18:的控制语句吗。这样显得很多余,不够pythonic。请问有其他的更优雅的处理方式吗?

  • 写回答

1条回答 默认 最新

  • user-from-future 2021-12-19 15:10
    关注

    img

    单独整个函数不知道算不算优雅

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 12月27日
  • 已采纳回答 12月19日
  • 创建了问题 12月19日

悬赏问题

  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?