相关疑难解决方法(0)

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

我想调用一种方法给我一个所有"非私有"的词典(我在这里使用"私有"一词,因为它在Python中并不存在)和非内置属性(即那些在类上不要以单个或双下划线开头.像vars(MyClass)这样的东西只能返回该类的"公共"属性.

我知道

from M import * 
Run Code Online (Sandbox Code Playgroud)

不会导入名称以下划线开头的对象.(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'
Run Code Online (Sandbox Code Playgroud)

如果我做

vars(MyClass).keys()
Run Code Online (Sandbox Code Playgroud)

我明白了

['_MyClass__gets_name_mangled', '__module__', '_private', '__doc__', '__dict__', '__weakref__', 'public', '__init__']
Run Code Online (Sandbox Code Playgroud)

我怎么才能得到

['public']
Run Code Online (Sandbox Code Playgroud)

或者我只是需要自己检查下划线?看起来似乎会有一种pythonic方式来做到这一点.

有关下划线和双下划线的更多信息,请参阅:对象名称之前的单下划线和双下划线 的含义是什么?

python private public built-in

8
推荐指数
2
解决办法
4034
查看次数

何时在Python中使用一个或两个下划线

好吧我想我已经理解在Python中使用一个和两个标题下划线了.

如果我错了,纠正我,

  1. 在一个下划线的情况下,下划线阻止from X import *语句导入此类变量.

  2. 在两个下划线的情况下,变量的名称前面加上它所属的类的名称,以允许更高级别的"私有性".

我现在的问题是:为什么不只使用两个下划线?在哪种情况下,两个下划线优先(或需要)一个下划线?

python naming-conventions private-members

8
推荐指数
2
解决办法
2256
查看次数

Python双下划线修改

我对这种行为感到有点困惑(使用python 3.2):

class Bar:
    pass

bar = Bar()
bar.__cache = None
print(vars(bar))        # {'__cache': None}

class Foo:
    def __init__(self):
        self.__cache = None

foo = Foo()
print(vars(foo))        # {'_Foo__cache': None}
Run Code Online (Sandbox Code Playgroud)

我已经阅读了一些关于双下划线如何导致属性名称被"损坏"的内容,但在上述两种情况下我都希望使用相同的名称.

在对象名称之前单引号和双下划线的含义是什么?

有什么想法在这里发生了什么?

python attributes double-underscore private-methods python-3.x

6
推荐指数
2
解决办法
3167
查看次数

python中的双下划线__是什么意思?

双下划线在python中表示什么?我记得读过一个教程,说它与隐藏变量有关,但我觉得它还有更多的东西,我不断看到有双重下划线的代码示例,我不明白这意味着什么.

python

6
推荐指数
1
解决办法
8321
查看次数

如何获得pandas .p​​lot(kind ='kde')的输出?

当我绘制我的熊猫系列的密度分布时我会使用

.plot(kind='kde')
Run Code Online (Sandbox Code Playgroud)

是否有可能获得该图的输出值?如果是的话怎么做?我需要绘制的值.

python pandas

6
推荐指数
2
解决办法
3667
查看次数

OOP - 组织大班

我开始为某些数学领域编写一个大型 python库.

所以我有这个数据结构(在A类中定义)代表一个数学模型.

我有一堆较小的函数,我把它放在A:

Af(),Ag(),...

这些或多或少是"帮助函数",它们是计算最终用户感兴趣的更重要的函数AX(),AY(),...所需要的.

所有这些功能当然都取决于A中的数据.

但是A中的方法数量正在增长和增长并且变得混乱.如何将这样一个类分成更小的部分.可以说,具有基本操作的数据结构和对结构进行计算的"方法"?

什么是通常的方法和最pythonic的方法?

python oop class

6
推荐指数
1
解决办法
88
查看次数

是否有双下划线功能的名称?

是否有一个术语以双下划线(例如initgetattr)开头和结尾?我理解他们的目的,只是想知道是否有一个很好的方式来引用它们!谢谢!

python

5
推荐指数
1
解决办法
368
查看次数

将函数放在类方法中是一种糟糕的编程习惯吗?

我正在看这样一个案例:

def parse_item(self, response):

    item = MetrocItem()

    def ver(string):
        if string:
            return string
        else:
            return 'null'

    item['latitude'] = ver(response.xpath('//input[@id="latitude"]/@value').extract_first())
Run Code Online (Sandbox Code Playgroud)

它有效,但有没有更好的方法来做到这一点?

python oop

5
推荐指数
1
解决办法
1141
查看次数

如何检查标识符是否为 dunder 或类私有(即将被破坏)?

我正在编写一个项目,提供有关变量名称的建议,并且我希望它能够判断名称是否与任何保留的标识符类匹配。第一个(“private”)非常简单,只是name.startswith('_'),但 dunder 和类私有名称更复杂。有没有内置函数可以告诉我?如果不是,Python 使用的内部规则是什么?

对于 dunder,检查name.startswith('__') and name.endswith('__')不起作用,因为它会匹配'__'。也许像这样的正则表达式^__\w+__$会起作用?

对于类私有,name.startswith('__')不起作用,因为 dunder 名称不会被破坏,也不会像 那样只包含下划线的名称'___'。所以看来我必须检查名称是否以两个下划线开头,不以两个下划线结尾,并且至少包含一个非下划线字符。是对的吗?在代码中:

name.startswith('__') and not name.endswith('__') and any(c != '_' for c in name)
Run Code Online (Sandbox Code Playgroud)

我最关心的是边缘情况,所以我想确保我的规则 100% 正确。我读过对象名称之前的单下划线和双下划线的含义是什么?但细节还不够。

python identifier name-mangling magic-methods

5
推荐指数
1
解决办法
973
查看次数

为什么 python 会在这里损坏

如果没有 cls.txt,为什么这段代码会失败?在 __TEXT 之前

__TEXT = "abcde"

print(__TEXT)
class aaa():
    @classmethod
    def bbb(cls):
        print(__TEXT)

aaa.bbb()
Run Code Online (Sandbox Code Playgroud)

输出是:

abcde
Traceback (most recent call last):
  File "<string>", line 9, in <module>
  File "<string>", line 7, in bbb
NameError: name '_aaa__TEXT' is not defined
Run Code Online (Sandbox Code Playgroud)

如果将 __TEXT 设为类变量并尝试在不使用类前缀的情况下引用它,如下所示:

class aaa():
    __TEXT = "abcde"
    @classmethod
    def bbb(cls):
        print(cls.__TEXT)
        print(__TEXT)

x = aaa()
x.bbb()
Run Code Online (Sandbox Code Playgroud)

你会得到同样的错误,但它没有意义:

abcde
Traceback (most recent call last):
  File "<string>", line 10, in <module>
  File "<string>", line 7, in bbb
NameError: name '_aaa__TEXT' is …
Run Code Online (Sandbox Code Playgroud)

python variables module class double-underscore

5
推荐指数
1
解决办法
116
查看次数