【发布时间】:2013-06-09 03:07:50
【问题描述】:
我想调用一个方法来给我一个包含所有“非私有”(我在这里使用术语“私有”的术语,因为它在 Python 中并不真正存在)和非内置属性(即那些不以单下划线或双下划线开头的)。类似 vars(MyClass) 的东西只会返回该类的“公共”属性。
我知道
from M import *
不导入名称以下划线开头的对象。 (http://www.python.org/dev/peps/pep-0008/#id25) import 是如何实现的?通过内置函数还是仅通过检查下划线?这样做的pythonic方法是什么?
例子:
class MyClass(object):
def __init__(self):
do_stuff()
def _private(self):
print 'private'
def __gets_name_mangled(self:
print 'becomes _MyClass__gets_name_mangled()'
def public(self):
print 'public'
如果我这样做了
vars(MyClass).keys()
我明白了
['_MyClass__gets_name_mangled', '__module__', '_private', '__doc__', '__dict__', '__weakref__', 'public', '__init__']
我怎样才能只得到
['public']
还是我只需要自己检查下划线?似乎有一种pythonic方式可以做到这一点。
有关下划线和双下划线的更多信息,请参阅: What is the meaning of a single- and a double-underscore before an object name?
【问题讨论】:
-
vars(MyClass).keys()是dir(MyClass) -
我不知道有什么功能可以做到这一点。总有:
[f for f in dir(MyClass) if not f.startswith('_')] -
@Elazar 如果我的理解是正确的, dir(MyClass) 将返回 MyClass 子类化的类的属性(如果 MyClass 碰巧发生子类化)除了在 MyClass 中定义的那些属性,而 vars(MyClass ) 只返回在 MyClass 中定义的那些属性。细微的差别。但原始问题仍然存在。
-
其实Pythonic的方式是定义一个函数:
def public_vars(klass): return [f for f in vars(MyClass) if f[0] != '_'] -
双下划线不代表私有。它的意思是“使用名称修饰”,这只是该类保留与任何子类中的相同属性不同的属性的一种机制
标签: python private public built-in