我想调用一种方法给我一个所有"非私有"的词典(我在这里使用"私有"一词,因为它在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中使用一个和两个标题下划线了.
如果我错了,纠正我,
在一个下划线的情况下,下划线阻止from X import *语句导入此类变量.
在两个下划线的情况下,变量的名称前面加上它所属的类的名称,以允许更高级别的"私有性".
我现在的问题是:为什么不只使用两个下划线?在哪种情况下,两个下划线优先(或需要)一个下划线?
我对这种行为感到有点困惑(使用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
双下划线在python中表示什么?我记得读过一个教程,说它与隐藏变量有关,但我觉得它还有更多的东西,我不断看到有双重下划线的代码示例,我不明白这意味着什么.
当我绘制我的熊猫系列的密度分布时我会使用
.plot(kind='kde')
Run Code Online (Sandbox Code Playgroud)
是否有可能获得该图的输出值?如果是的话怎么做?我需要绘制的值.
我开始为某些数学领域编写一个大型 python库.
所以我有这个数据结构(在A类中定义)代表一个数学模型.
我有一堆较小的函数,我把它放在A:
Af(),Ag(),...
这些或多或少是"帮助函数",它们是计算最终用户感兴趣的更重要的函数AX(),AY(),...所需要的.
所有这些功能当然都取决于A中的数据.
但是A中的方法数量正在增长和增长并且变得混乱.如何将这样一个类分成更小的部分.可以说,具有基本操作的数据结构和对结构进行计算的"方法"?
什么是通常的方法和最pythonic的方法?
是否有一个术语以双下划线(例如init或getattr)开头和结尾?我理解他们的目的,只是想知道是否有一个很好的方式来引用它们!谢谢!
我正在看这样一个案例:
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)
它有效,但有没有更好的方法来做到这一点?
我正在编写一个项目,提供有关变量名称的建议,并且我希望它能够判断名称是否与任何保留的标识符类匹配。第一个(“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% 正确。我读过对象名称之前的单下划线和双下划线的含义是什么?但细节还不够。
如果没有 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 ×10
class ×2
oop ×2
attributes ×1
built-in ×1
identifier ×1
module ×1
pandas ×1
private ×1
public ×1
python-3.x ×1
variables ×1