为什么我们需要Python中的属性?

David Zheng

我了解使用属性的主要目的之一是进行验证和格式化。例如,我有一个如下所示的User类。我希望在设置名字和姓氏时将其大写。如果可以编写以下代码来实现相同的格式设置结果,为什么需要属性?

class User:
    def __init__(self, firstname, lastname):
        self.firstname = firstname
        self.lastname = lastname

    def __setattr__(self, attr, value):
        if attr == 'firstname':
            self.__dict__[attr] = value.capitalize()
        elif attr == 'lastname':
            self.__dict__[attr] = value.capitalize()
me

没错,您不需要属性就可以在设置属性时执行验证,也不需要在执行属性查找时执行特殊行为。但是属性更易读,更易于编写。我会坚持使用__getattr__,并__setattr__在你需要动态访问属性(也就是,你不知道什么属性,你就必须在类定义的时间)的情况。否则,请使用属性,因为它们是非常容易识别的python习惯用法。

实际上,在这种情况下,如果您有两个执行相同验证的属性,则可以使用描述符

class NameDescriptor(object):

    def __init__(self, key):
        self.key = key

    def __get__(self, obj, objtype):
        return getattr(obj, self.key)

    def __set__(self, obj, val):
        setattr(obj, self.key, val.capitalize())

class User(object):

    firstname = NameDescriptor('_firstname')
    lastname = NameDescriptor('_lastname')

    def __init__(self, first, last):
        self.firstname = first
        self.lastname = last

演示如何工作的:

>>> user = User('steve', 'martin')
>>> user.firstname
'Steve'
>>> user.firstname = 'dean'
>>> user.firstname
'Dean'

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么我们在Groovy中需要@lazy属性,它的优点是什么?

来自分类Dev

为什么我们需要Clojure中的'in(require'[...]])?

来自分类Dev

为什么我们需要MapReduce中的“地图”部分?

来自分类Dev

为什么我们在MongoDB中需要created_at

来自分类Dev

为什么我们需要Java中的Properties类?

来自分类Dev

为什么我们需要纯<?>在Java中?

来自分类Dev

为什么我们在Typescript中需要任何类型?

来自分类Dev

为什么我们需要Kubernetes中的服务帐户?

来自分类Dev

我们为什么需要容器?

来自分类Dev

为什么我们需要IO?

来自分类Dev

为什么我们在python中的每个方法上都需要相应的类函数?

来自分类Dev

为什么我们使用 try,除了在 Python 中

来自分类Dev

为什么我们需要创建新的Icollection类型属性实例

来自分类Dev

为什么我们需要创建新的Icollection类型属性实例

来自分类Dev

为什么我们在http响应消息中既需要状态代码又需要短语代码?

来自分类Dev

为什么我们在http响应消息中既需要状态代码又需要短语代码?

来自分类Dev

什么是BIOS,为什么我们需要它?

来自分类Dev

为什么我们需要在 python 中的 f 字符串周围放置撇号?

来自分类常见问题

为什么我们需要使用flatMap?

来自分类Dev

mongodb为什么我们需要getSisterDB

来自分类Dev

为什么我们需要Avro模式演变

来自分类Dev

为什么我们需要虚拟内存?

来自分类Dev

为什么我们需要在Linux上挂载?

来自分类Dev

为什么我们需要gevent.queue?

来自分类Dev

为什么我们需要创建CFC的实例?

来自分类Dev

为什么我们需要把*用作指针

来自分类Dev

为什么我们需要* .lib文件?

来自分类Dev

为什么我们需要分别编译和链接?

来自分类Dev

为什么我们需要隐式应用

Related 相关文章

  1. 1

    为什么我们在Groovy中需要@lazy属性,它的优点是什么?

  2. 2

    为什么我们需要Clojure中的'in(require'[...]])?

  3. 3

    为什么我们需要MapReduce中的“地图”部分?

  4. 4

    为什么我们在MongoDB中需要created_at

  5. 5

    为什么我们需要Java中的Properties类?

  6. 6

    为什么我们需要纯<?>在Java中?

  7. 7

    为什么我们在Typescript中需要任何类型?

  8. 8

    为什么我们需要Kubernetes中的服务帐户?

  9. 9

    我们为什么需要容器?

  10. 10

    为什么我们需要IO?

  11. 11

    为什么我们在python中的每个方法上都需要相应的类函数?

  12. 12

    为什么我们使用 try,除了在 Python 中

  13. 13

    为什么我们需要创建新的Icollection类型属性实例

  14. 14

    为什么我们需要创建新的Icollection类型属性实例

  15. 15

    为什么我们在http响应消息中既需要状态代码又需要短语代码?

  16. 16

    为什么我们在http响应消息中既需要状态代码又需要短语代码?

  17. 17

    什么是BIOS,为什么我们需要它?

  18. 18

    为什么我们需要在 python 中的 f 字符串周围放置撇号?

  19. 19

    为什么我们需要使用flatMap?

  20. 20

    mongodb为什么我们需要getSisterDB

  21. 21

    为什么我们需要Avro模式演变

  22. 22

    为什么我们需要虚拟内存?

  23. 23

    为什么我们需要在Linux上挂载?

  24. 24

    为什么我们需要gevent.queue?

  25. 25

    为什么我们需要创建CFC的实例?

  26. 26

    为什么我们需要把*用作指针

  27. 27

    为什么我们需要* .lib文件?

  28. 28

    为什么我们需要分别编译和链接?

  29. 29

    为什么我们需要隐式应用

热门标签

归档