为了账号安全,请及时绑定邮箱和手机立即绑定

在def定义函数的时候, @和-> 代表什么?

在def定义函数的时候, @和-> 代表什么?

凤凰求蛊 2019-02-24 03:52:36
在阅读别人的源码的时候, 发现他大量的使用了这种方式定义函数: @property def attrs(self) -> _Attrs: pass 不知道其中的@property和 -> _Attrs:是做什么用的? 请问哪里有相关的说明? 感谢.
查看完整描述

3 回答

?
拉丁的传说

TA贡献1789条经验 获得超8个赞

关于@property

这是一个python面向对象的编程问题,比较简单:

@property是一个装饰器,它能够使得类把一个方法变成属性调用的。

比如,python类中,我想要访问、设置私有变量,可以通过和C++类似的方式,如:

class Student(object):

    def get_score(self):
         return self._score

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


s = Student()
s.set_score(60) # ok!
s.get_score()

不过,这样看起来有些麻烦,实际上python获取、设置类的变量(非私有变量)可以直接通过如下方式:

class Student(object):
    pass

s = Student()
s.score = 90
print(s.score) # 90

这样看起来是不是很简单?但是也有危险,这样对于类的变量的赋值的类型是不可确定的,无法对变量赋值类型进行检查限制,比如可以赋值为整数、字符串、boolean变量等。想要实现这样获取值、赋值,也不是不行,通过@property就可以实现:

class Student(object):
    @property
    def get_score(self):
         return self._score
    @property
    def set_score(self, value):
        if not isinstance(value, int):
            raise ValueError('score must be an integer!')
        if value < 0 or value > 100:
            raise ValueError('score must between 0 ~ 100!')
        self._score = value

s = Student()
s.score = 90
print(s.score) # 90
s.score = '100' #报错

参考:廖雪峰的python教程--使用@property

关于 -> _Attrs

->常常出现在python函数定义的函数名后面,为函数添加元数据,描述函数的返回类型,从而方便开发人员使用。比如:

def add(x, y) -> int:
  return x+y

这里面,元数据表明了函数的返回值为int类型。
至于楼主问题中的,-> _Attr则表明函数返回的是一个外部可访问的类的私有变量。

参考:给函数参数增加元信息

查看完整回答
反对 回复 2019-03-01
?
qq_花开花谢_0

TA贡献1835条经验 获得超7个赞

Google一下...

官方文档函数定义这一节都有讲

顺便贴一下搜到的博文:
Python 函数注释:奇怪的:,->符号
装饰器

查看完整回答
反对 回复 2019-03-01
  • 3 回答
  • 0 关注
  • 620 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信