石头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日

悬赏问题

  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line
  • ¥500 火焰左右视图、视差(基于双目相机)
  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)