交流群:462197261站长百科站长论坛热门标签收藏本站北冥有鱼 互联网前沿资源第一站 助力全行业互联网+
点击这里给我发消息
  • 当前位置:
  • Python 中@property的用法详解

    北冥有鱼 教程大全 2020-01-15 ,,

    在绑定属性时,如果我们直接把属性赋值给对象,比如:

    p = Person()
    p.name= 'Mary'
    

    我们先看个详细的例子(注意双下划线name和age定义为私有变量):

    class Person(object):
      def __init__(self, name, age):
        self.__name = name
        self.__age = age
    
      def get_age_fun(self):
         return self.__age
    
      def set_age_fun(self, value):
        if not isinstance(value, int):
          raise ValueError('年龄必须是数字!')
        if value < 0 or value > 100:
          raise ValueError('年龄必须是0-100')
        self.__age = value
    
      def print_info(self):
        print('%s: %s' % (self.__name, self.__age))
    
    
    p = Person('balala',20)
    p.__age = 17
    print(p.__age) # 17
    print(p.get_age_fun()) # 20 表面上看,上面代码“成功”地设置了__age变量 17,但实际上这个__age变量和class内部的__age变量不是一个变量!
    # 内部的__age变量已经被Python解释器自动改成了_Person_age,而外部代码给p新增了一个__age变量。 所以调用 get_age_fun输出的是初始值
    
    p.set_age_fun(35)
    print(p.get_age_fun()) # 35
    
    print(p.print_info()) # balala: 35
    

    输出:

    17
    20
    35
    balala: 35

    表面上看,外部代码“成功”地设置了__age变量 17,但实际上这个_age变量和class内部的_age变量不是一个变量!

    内部的_age变量已经被Python解释器自动改成了_Person_age,而外部代码给p新增了一个_age变量。 所以调用 get_age_fun输出的是初始值 20

    而set_age_fun 通过class内部改变了age变量值,所以最终输出 balala: 35

    我们再稍微调整下:

    (注意只改变了一个变量名: 原来的私有属性 __age 单下划线为: _age,也可以定义为:age.
    解释:以一个下划线开头的实例变量名,比如_age,这样的实例变量外部是可以访问的,但是,按照约定俗成的规定,当看到这样的变量时,意思是,"虽然可以被访问,但是,请视为私有变量,不要随意访问。")

    class Person(object):
      def __init__(self, name, age):
        self.__name = name
        self._age = age
    
      def get_age_fun(self):
         return self._age
    
      def set_age_fun(self, value):
        if not isinstance(value, int):
          raise ValueError('年龄必须是数字!')
        if value < 0 or value > 100:
          raise ValueError('年龄必须是0-100')
        self._age = value
    
      def print_info(self):
        print('%s: %s' % (self.__name, self._age))
    
    
    p = Person('balala',20)
    p._age = 17
    print(p._age) # 17
    print(p.get_age_fun()) # 这里是17 不再是 20,因为此时_age是全局变量,外部直接影响到类内部的更新值
    
    p.set_age_fun(35)
    print(p.get_age_fun()) # 35
    
    print(p.print_info()) # balala: 35
    
    

    输出:

    1 17
    2 17
    3 35
    4 balala: 35

    看的出私有和全局的设置

    但是,上面的调用方法是不是略显复杂,没有直接用属性这么直接简单。

    有没有可以用类似属性这样简单的方式来访问类的变量呢?必须的,对于类的方法
    我们先来看一个稍微改造的例子:(稍后我们再使用Python内置的@property装饰器就是负责把一个方法变成属性调用.)

    我们进入正题:看看@property的妙用之处:

    class Person(object):
      def __init__(self, name, age):
        self.__name = name
        self.__age = age
    
      @property
      def get_age_fun(self):
         return self.__age
    
      @get_age_fun.setter # get_age_fun是上面声明的方法
      def set_age_fun(self, value):
        if not isinstance(value, int):
          raise ValueError('年龄必须是数字!')
        if value < 0 or value > 100:
          raise ValueError('年龄必须是0-100')
        self.__age = value
    
      def print_info(self):
        print('%s: %s' % (self.__name, self.__age))
    
    
    p = Person('balala',20)
    p.__age = 17
    print(p.__age) # 17
    print(p.get_age_fun) # 20 注意这里不带()
    
    #p.set_age_fun(35) 注意不能这样调用赋值了
    p.set_age_fun = 35 # 这里set_age_fun 就是 声明的函数不带()
    print(p.get_age_fun) # 35
    print(p.print_info()) # balala: 35

    输出:

    17
    20
    35
    balala: 35

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持北冥有鱼。


    广而告之:
    热门推荐:
    关于javascript中的parseInt使用技巧

    要对表单中填写的日期格式进行客户端验证,于是在网上找了段代码,其中用到parseInt对年月日做判断,其中有类似这样的语句: ...... else if(parseInt(month)<1 || parseInt(month) >12) ...... 可是对于当前本来正确的日期,这里怎么也通不过。后来一查才明白···

    PHP借助phpmailer发送邮件

    本地没有发邮件的服务器,借助现成的SMTP服务器发送邮件是个不错的选择,这里使用到的工具是phpmailer ( Version 5.2.0),SMTP服务器就选gmail和163。 1. 使用gmail发送的脚本 include("class.phpmailer.php"); include("class.smtp.php"); //获取一个外部文件的内容 $mail ···

    Php+SqlServer实现分页显示

    <html><body><table border=1> <? $id=@mssql_connect("ddy","sa"," ") or die("连接不上"); $db=mssql_select_db("ddy",$id); $query="select * from lr00 order by lr0012 desc"; $···

    Yii数据读取与跳转参数传递用法实例分析

    本文实例讲述了Yii数据读取与跳转参数传递用法。分享给大家供大家参考,具体如下: $toop=array('id'=>'aaaa','name'=>'bbbb','nickname'=>'ccccc','phone'=>'ddddd','status'=>'eeeeee','mytest'=>$te); $test='hello world!'; $te="\$this->test='qweq···

    简单示例AJAX结合PHP代码实现登录效果代码

    HTML部分: <html> <head> <scrīpt language="javascrīpt"> function postRequest(strURL){ var xmlHttp; if(window.XMLHttpRequest){ // For Mozilla, Safari, ... var xmlHttp = new X···

    你不需要jQuery(三) 新AJAX方法fetch()

    XMLHttpRequest来完成ajax有些老而过时了。 fetch()能让我们完成类似 XMLHttpRequest (XHR) 提供的ajax功能。它们之间的主要区别是,Fetch API 使用了 Promises,它让接口更简单、简洁,避免了回调的复杂性,省去了使用复杂的 XMLHttpRequest API。 如果你之前未使用过Promises···

    ThinkPHP模板之变量输出、自定义函数与判断语句用法

    本文实例讲述了ThinkPHP模板之变量输出、自定义函数与判断语句用法。主要包括变量输出、自定义函数与判断语句三种用法。分享给大家供大家参考。具体分析如下: 模板操作变量输出: 快捷输出变量 复制代码 代码如下:{:function(…)} //执行方法并输出返回值 {~function} //执行方···

    jQuery实现二级下拉菜单效果

    大家都知道jQuery是一个框架,它对JS进行了封装,使其更方便使用。前面两篇博文分别是用CSS样式和JS实现的,那么这篇就用jQuery来实现二级下拉式菜单。 使用JQuery实现需要用到的知识有:        1)使用$(function(){...})获取到想要作用的HTML···

    浅谈css元素居中

    水平居中 若为行内元素,对其父元素用text-align:center即可; 若为块元素(无浮动),则一般有两种方法可实现对其的水平居中,一为margin:0 auto;二为通过css计算函数calc; 垂直居中 若为行内元素,一般对其父元素用line-height:{height}即可,若为图片元素则需再对该元素使···

    优秀的软文文案编辑角度出发点是什么?

      第一点:软文的核心点只能是一点,核心点太多会显得文章比较混乱,显得不专业。   第二点:写软文要从客户的角度去写软文,一切都要遵守用户第一的原则,而不是产品第一位,不然就成广告了。   1. 努力成为做行业先知   对于如何写好软文很多朋友都感觉迷茫,主要的···