相关疑难解决方法(0)

为什么Python的"私有"方法实际上不是私有的?

Python使我们能够通过在名称前加上双下划线来在类中创建"私有"方法和变量,如下所示:__myPrivateMethod().那么,如何解释这一点呢

>>> class MyClass:
...     def myPublicMethod(self):
...             print 'public method'
...     def __myPrivateMethod(self):
...             print 'this is private!!'
... 
>>> obj = MyClass()
>>> obj.myPublicMethod()
public method
>>> obj.__myPrivateMethod()
Traceback (most recent call last):
  File "", line 1, in 
AttributeError: MyClass instance has no attribute '__myPrivateMethod'
>>> dir(obj)
['_MyClass__myPrivateMethod', '__doc__', '__module__', 'myPublicMethod']
>>> obj._MyClass__myPrivateMethod()
this is private!!
Run Code Online (Sandbox Code Playgroud)

这是怎么回事?!

我会对那些没有那么做的人解释一下.

>>> class MyClass:
...     def myPublicMethod(self):
...             print 'public method'
...     def __myPrivateMethod(self):
...             print 'this is private!!'
... 
>>> obj = MyClass()
Run Code Online (Sandbox Code Playgroud)

我在那里做的是使用公共方法和私有方法创建一个类并实例化它.

接下来,我称之为公共方法.

>>> obj.myPublicMethod() …
Run Code Online (Sandbox Code Playgroud)

python encapsulation information-hiding python-2.7

632
推荐指数
11
解决办法
41万
查看次数

再次进行python循环导入(也就是这个设计有什么问题)

让我们考虑python(3.x)脚本:

main.py:

from test.team import team
from test.user import user

if __name__ == '__main__':
    u = user()
    t = team()
    u.setTeam(t)
    t.setLeader(u)
Run Code Online (Sandbox Code Playgroud)

测试/ user.py:

from test.team import team

class user:
    def setTeam(self, t):
        if issubclass(t, team.__class__):
            self.team = t
Run Code Online (Sandbox Code Playgroud)

测试/ team.py:

from test.user import user

class team:
    def setLeader(self, u):
        if issubclass(u, user.__class__):
            self.leader = u
Run Code Online (Sandbox Code Playgroud)

现在,当然,我已经获得了循环导入和出色的ImportError.

所以,不是pythonista,我有三个问题.首先:

一世.我怎么能让这个东西工作?

并且,知道某人将不可避免地说"循环导入总是表明设计问题",第二个问题来自:

II.为什么这个设计不好?

最后,第三个:

III.什么是更好的选择?

确切地说,上面的类型检查只是一个例子,还有一个基于类的索引层,它允许ie.发现所有用户都是一个团队的成员(用户类有许多子类,因此索引加倍,对于一般用户和每个特定子类)或所有团队都将用户作为成员

编辑:

我希望更详细的例子能够澄清我试图实现的目标.为了可读性省略了文件(但是有一个300kb的源文件让我感到害怕,所以请假设每个类都在不同的文件中)

# ENTITY

class Entity:
    _id    = None
    _defs  = {}
    _data  = None

    def …
Run Code Online (Sandbox Code Playgroud)

python dependencies class-design python-import

46
推荐指数
1
解决办法
2万
查看次数