相关疑难解决方法(0)

Python“私有”类方法和 DRY

有时,一个类会有其他方法调用的“私有” : @classmethod

class FooClassThisSometimesHasALongNameEspIfAUnittestSubclasss(...):
    @classmethod
    def foo():
        ... 

    def bar(self):
        ...
        FooClassThisSometimesHasALongNameEspIfAUnittestSubclasss.foo()
        ...
Run Code Online (Sandbox Code Playgroud)

可以看到,类名是重复的;诚然,这可能还没有严重到导致当前技术崩溃并引发僵尸大灾难,但它仍然是一种DRY违规,而且有点烦人。

类似问题super的答案表明这是Py3 新的原因之一super

在缺少某些神奇normal()函数(与 相反super(),返回当前类)的情况下,是否有某种方法可以避免重复?

python dry class-method

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

Python文件名中双下划线的意义

除了__init__.py文件之外,前导和尾随双下划线在文件名中是否有任何意义?例如,是否__model__.py比任何方式更重要model.py

python

4
推荐指数
1
解决办法
1321
查看次数

Python父类访问子私有变量

以下代码生成错误:

class A(object):
    def say_something(self):
        print(self.foo)
        print(self.__bar)

class B(A):
    def __init__(self):
        self.foo = 'hello'
        self.__bar = 'world'

test = B()
test.say_something()
Run Code Online (Sandbox Code Playgroud)

打印'hello'成功,但'world'会产生以下错误:

    print(self.__bar)
Run Code Online (Sandbox Code Playgroud)

我对此感到惊讶,我希望我的父类有一个方法可以访问其子级保证拥有的私有属性.有没有一些解决这个问题的标准方法?

附加问题:因此,如果我对一个属性使用单个下划线,那么从另一个对象使用它是不对的?是一个下划线说"我会使用这个,但用户不应该"或甚至开发人员将其视为私有.这段代码是不好的风格:

class A(object):
    def say_something(self):
        print(self.foo)
        print(self.__bar)

class B(A):
    def __init__(self):
        self.foo = 'hello'
        self.__bar = 'world'

test = B()
test.say_something()
Run Code Online (Sandbox Code Playgroud)

python oop inheritance class

4
推荐指数
1
解决办法
4896
查看次数

Python单引号和双下划线变量的问题

我不确定我做错了什么; 或者为什么会这样.

我有以下代码:

class Expression (Node):
  """
  ...
  """

  def __init__ (self):
    self.__expressionType = None


  def expressionType (self):
    return self.__expressionType


class Number (Expression):
  """
  Number .
  """

  def __init__ (self, value):
    """
    Value is an entry of type Constant.
    """
    Expression.__init__(self)
    assert isinstance (value, KST.Constant)
    self.__constant = value
    self.__expressionType = value.elementType()
Run Code Online (Sandbox Code Playgroud)

对于一个数字对象说n = Number(KST.Constant(..)),我总是返回无以下声明 -

 n.expressionType()
Run Code Online (Sandbox Code Playgroud)

现在,如果我将双下划线更改为单个下划线,则一切正常.我理解私有和半私有变量之间的区别,但为什么会这样 - 我不知道.另外,我在其他许多地方使用过"__",这一切似乎都很好.

python inheritance

4
推荐指数
1
解决办法
2341
查看次数

如何在python中编写模块私有/受保护的方法?

我明白要编写你使用的python模块私有/受保护的函数

def _func():
    ...
Run Code Online (Sandbox Code Playgroud)

但我有一个具有专门覆盖的对象层次结构.另外我想隐藏内部实现(因为它不适合外部使用,因此我希望能够在不破坏代码的情况下改进它,而不是我认为除了我之外任何人都会使用它).如果我使用

class Paragraph(Tag):
    def _method(self):
        ...
Run Code Online (Sandbox Code Playgroud)

并尝试从另一个类中调用_method,该类继承Tag IntelliJ IDEA(可能还有pylint /其他检查器)也会给我一个警告.有没有什么办法解决这一问题?

我的用例是一组markdown标记对象,用于生成类似"Tree"的结构,可以将其转换为正确的markdown字符串.每个标签覆盖一个受保护的方法本身以及它所包含的标签和一些覆盖变换的方法来检查子标签是否有效(例如,没有嵌套加粗).只有顶级标记上下文具有转换树的公共方法.

编辑:

IntelliJ IDEA警告:

访问类_method的受保护成员

python private protected

4
推荐指数
1
解决办法
5483
查看次数

How to call a derived class method?

I have the following classes:

class A:
    def __init__(self):
         #base constructor implementation
         pass

    def __virt_method(self):
        raise NotImplementedError()

    def public_method(self):
        self.__virt_method()

class B(A):
    def __init(self):
        A.__init__(self)
        #derived constructor implementation
        pass

    def __virt_method(self):
        #some usefull code here
        pass
Run Code Online (Sandbox Code Playgroud)

I'm trying to use it like this, supposing that the overridden method to be called:

b = B()
b.public_method()
Run Code Online (Sandbox Code Playgroud)

But instead I'm getting NotImplementedError (Am I doing something wrong or is it a Python (2?) problem? I know that Python 2 is deprecated and …

python python-2.7

4
推荐指数
1
解决办法
43
查看次数

如何/为什么这在python中工作?rover._Dog__password()

我正在做python koan(对于python 2.6)并且发现了一些我不理解的东西.其中一个文件在第160行中包含以下代码:

class Dog(object):
    def __password(self):
        return 'password'
Run Code Online (Sandbox Code Playgroud)

这个

rover = Dog()
password = rover.__password()
Run Code Online (Sandbox Code Playgroud)

结果是AttributeError.这对我来说很清楚.(__password(self)由于领先的两个下划线,是某种私人方法).

但是这个

rover._Dog__password()
Run Code Online (Sandbox Code Playgroud)

对我来说是一个谜.有人可以向我解释这是如何或为什么有效或更好地指向我所描述的文档?

python methods syntax private class

3
推荐指数
1
解决办法
143
查看次数

_func(),下划线的任何功能用途?(蟒蛇)

我创建了两个模块,一个用于

def _func():
    print "hi"
Run Code Online (Sandbox Code Playgroud)

和另一个

def func():
    print "hi"
Run Code Online (Sandbox Code Playgroud)

当我在包括第一个功能的模块上使用帮助功能时,帮助模块不显示此功能.与此功能在帮助输出中显示的第二个示例相反.除了使用帮助功能之外还有其他功能吗?

python function

3
推荐指数
1
解决办法
630
查看次数

Python属性错误对象没有属性

当我应用两个下划线时,出现错误AttributeError: 'Organization' object has no attribute '__employees' Here is the code。

 class Organization(object):
        __employees=[]

    google=Organization()
    google.__employees.append('Erik')
Run Code Online (Sandbox Code Playgroud)

Python 没有实现私有变量的概念。如果是这样,我会得到什么错误。如果我删除一个下划线代码执行没有错误。

python oop

3
推荐指数
1
解决办法
1888
查看次数

Python:私有内部Enum类中的静态方法

我在实现名为Parser的类中实现内部私有枚举类:“ LineCode”时遇到了麻烦。

LineCode:私有Enum类,它定义6种通用可能的代码行类型。我使用Enum实例化发送正则表达式模式,并在构造函数__init__中对其进行编译,然后将正则表达式匹配器作为类变量保存。

解析器:解析一种编程语言,与什么语言无关。解析器正在使用LineCode来标识行并相应地进行处理。

问题:我无法从静态方法访问__LineCode的枚举成员。我希望在__LineCode中有一个static方法“ matchLineCode(line)”,该方法从解析器接收一个字符串,然后按以下逻辑对Enum成员进行迭代:

  • 如果找到匹配项:返回枚举
  • 如果没有更多的枚举:不返回

这似乎并不简单,我无法访问枚举成员来执行此操作。

尝试:我尝试使用以下方法遍历枚举:

  1. __LineCode .__ members __。values()
  2. 解析器.__ lineCode .__成员__。values()

两者均失败,因为找不到__lineCode。

理想情况下: LineCode类必须是私有的,并且对于导入解析器的任何其他类都不可见。解析器必须使用LineCode类提供的静态方法来返回Enum。我愿意接受任何解决此问题或模仿此行为的解决方案。

我省略了一些不相关的Parser方法以提高可读性。码:

class Parser:
    class __LineCode(Enum):
        STATEMENT = ("^\s*(.*);\s*$")
        CODE_BLOCK = ("^\s*(.*)\s*\{\s*$")
        CODE_BLOCK_END = ("^\s*(.*)\s*\}\s*$")
        COMMENT_LINE = ("^\s*//\s*(.*)$")
        COMMENT_BLOCK = ("^\s*(?:/\*\*)\s*(.*)\s*$")
        COMMENT_BLOCK_END = ("^\s*(.*)\s*(?:\*/)\s*$")
        BLANK_LINE = ("^\s*$")

        def __init__(self, pattern):
            self.__matcher = re.compile(pattern)

        @property
        def matches(self, line):
            return self.__matcher.match(line)

        @property
        def lastMatch(self):
            try:
                return self.__matcher.groups(1)
            except:
                return None

        @staticmethod
        def matchLineCode(line):
            for lineType in **???**:
                if lineType.matches(line): …
Run Code Online (Sandbox Code Playgroud)

python enums static-methods

3
推荐指数
1
解决办法
1771
查看次数