加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

是否有Python方法可以访问类的所有非私有和非内置属性?

发布时间:2020-12-16 23:44:33 所属栏目:Python 来源:网络整理
导读:我想调用一种方法给我一个所有“非私有”的词典(我在这里使用“私有”一词,因为它在 Python中并不存在)和非内置属性(即那些在类上不要以单个或双下划线开头.像vars(MyClass)这样的东西只能返回该类的“公共”属性. 我知道 from M import * 不会导入名称以下
我想调用一种方法给我一个所有“非私有”的词典(我在这里使用“私有”一词,因为它在 Python中并不存在)和非内置属性(即那些在类上不要以单个或双下划线开头.像vars(MyClass)这样的东西只能返回该类的“公共”属性.

我知道

from M import *

不会导入名称以下划线开头的对象. (http://www.python.org/dev/peps/pep-0008/#id25)导入如何实现?通过内置函数或仅通过检查下划线?什么是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?

解决方法

实际上,存在这样的函数将是unpythonic – 因为“正式”Python中没有私有或受保护的字段/属性.

虽然在从某个模块*导入*期间丢弃具有前导下划线(通常是一些实现细节)的模块属性是有意义的,但它在任何其他对象的上下文中都没有用.

因此,如果您只需要列出对象的“公共”方法/属性,只需遍历dir的结果并删除带有前导下划线的名称.

*“在导入期间*从某些模块’”

通常这不是最好的做法.考虑下一个例子:

模块A定义了a1和a2

模块B定义了b1和b2

模块C中的此代码按预期工作:

from A import a1,a2
from B import *

想象一下,我们在模块B中添加了函数a1.现在突然模块C被破坏了,尽管我们没有触及它.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读