• python的属性(property)使用


    在面向对象编程的时候,我们定义一个Person

    class Person:
      def __init__(self):
          self.age = 22
    

    这样写法能够方便的访问属性age,

    p = Person()
    print p.age ==>22
    p.age = 30
    print p.age ==>30
    

    这样写起来虽然很简单,但是没有参数检验(eg,输入非数值,输入过大的数值)。
    写过Java的人知道,在Java有一种类叫做实体类(entity,javabean等),它们一般不提供其他复杂的方法只提供简单的gettersetter等方法。如下例子

    public class person{ 
    private int age; 
     public String getAge()
    {
         return this.age;
     } 
     public String setAge(String age)
    { 
        if(age > 100) {}//数值检验
         return this.age=age; 
     }
     }
    

    同理我们可以按照这个思路来编写python代码

    class Person:
      def __init__(self):
          self.age = None
      def get_age(self):
          return self.age
      def set_age(self,age):
          if not isinstance(age, int):
                raise ValueError('age must be an integer!')
          if age < 0 or age > 100:
                raise ValueError('age must between 0 ~ 100!')
          self.age = age
    

    这样写就完善很多,参数不会被随意更改了。访问age的时候需要使用p.get_age(),但这种写法不够pythonic,强大的python提供了@property方法,方法如下

    class Person(object):
      def __init__(self):
          self._age = None
      @property
      def age(self):
          return self._age
      @age.setter
      def age(self,_age):
          if not isinstance(_age, int):
                raise ValueError('age must be an integer!')
          if _age < 0 or _age > 100:
                raise ValueError('age must between 0 ~ 100!')
          self._age = _age
    p=Person()
    

    这里面有一点需要注意,就是在自定义类的时候需要使用新式类,即继承了object

  • 相关阅读:
    ColorPix——到目前为止最好用的屏幕取色器
    ES+VBA 实现批量添加网络图片
    SQL语句-delete语句
    Visual C++ 2013 and Visual C++ Redistributable Package 更新版官网下载地址
    centos长ping输出日志的脚本
    Centos 常用命令
    c#连接数据库
    C#窗体间的跳转传值
    c#邮件发送
    C#WIFI搜索与连接
  • 原文地址:https://www.cnblogs.com/wxshi/p/7712060.html
Copyright © 2020-2023  润新知