【问题标题】:Naming Conventions for Class Methods and Attributes [closed]类方法和属性的命名约定 [关闭]
【发布时间】:2014-01-10 19:17:26
【问题描述】:

命名类属性及其方法(函数)的最佳做法是什么。

class Base():   
    def __init__(self):
        self.name = 'My Name'
    def print_this(self):
        print "Hello"

创建一个类的实例:

a = Base()

了解此类中可用的方法和属性:

print dir(a)

得到这个输出:

['__doc__', '__init__', '__module__', 'name', 'print_this']

通过读取 dir() 输出中的名称,不可能看到变量在哪里(类属性)和方法在哪里(类函数)。

使用哪些命名约定来区分变量与函数(或属性与方法)?

【问题讨论】:

  • 如果我是你,我会去阅读 PEP 8 的命名约定
  • 也看看 flake8 pypi.python.org/pypi/flake8 并开始使用吧。
  • 查看 PEP 8 肯定是一个好主意,但同样值得注意的是,尝试在 Python 中实现这样的命名约定充满了陷阱。例如,property 应该获取属性变量样式还是实例方法样式?根据上下文,它们同样有效。
  • print {name: type(a[name]) for name in dir(a)} - 现在你知道类型了
  • 这个问题没有正确答案。 “我应该使用什么命名约定?”

标签: python class methods attr


【解决方案1】:

方法中通常应该有一个动词,例如print_thiscalculate_thatsave,因为它们执行一些操作。

属性和属性只是一个裸名词,例如namestatuscount,因为它们只包含一个值,或者在属性的情况下,底层函数应该计算并返回一个值,没有其他副作用。

你的问题很模糊:

  • 这与 Python 中的命名约定有关吗?为此,您应该参考famous PEP8 document

  • 是关于如何通过查看名称来区分方法和属性的吗?为此,请参阅我上面的经验法则

  • 是关于如何以编程方式区分方法和属性吗?在这种情况下,您可以使用inspect 模块来提供明确的答案,例如:

    import inspect
    
    for attr in dir(a):
        if inspect.ismethod(getattr(a, attr)):
            print '%s is a method' % attr
        else:
            print '%s is an attribute or property' % attr
    

【讨论】:

  • 布尔值有点难以命名。 x.printable 可以,但 y.calculate_slowly 是一种模棱两可的方法,仅基于名称
  • callable() 技巧并不总是有效。如果属性或属性包含可调用对象怎么办?
  • @glglgl 好点...已将其更改为使用inspect.ismethod
  • @Eric - 对于布尔值,在变量前加上“is”或“do”。例如,“is_printable”和“do_calculate_slowly”。
  • @CraigS.Anderson: is_ 我同意,但作为祈使动词,do_ 对我来说强烈暗示“方法”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-23
  • 2017-03-28
  • 2012-12-03
  • 2011-08-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多