相关疑难解决方法(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的__add__和__concat__有什么区别?

Python的标准运算符列表包括__add__(a, b)__concat__(a, b).它们通常都被调用a + b.我的问题是,它们之间有什么区别?是否存在使用一个而不是另一个的情况?你有什么理由在一个对象上定义它们吗?

这是我找到的方法中提到的文档.

编辑:添加到奇怪的是这个文档:

最后,序列类型应该实现加成(意味着串联)和乘法(意味着重复)通过定义的方法__add__(),__radd__(),__iadd__(),__mul__(),__rmul__()__imul__()下面描述的; 他们不应该定义__coerce__()或其他数字运算符.

python operators

12
推荐指数
1
解决办法
1746
查看次数

Python:将绑定方法更改为另一个方法

我试图了解python中的绑定方法,并实现了以下代码:

class Point:
    def __init__(self, x,y):
        self.__x=x
        self.__y=y

    def draw(self):
        print(self.__x, self.__y)

def draw2(self):
    print("x",self.__x, "y", self.__y)

p1=Point(1,2)
p2=Point(3,4)
p1.draw()
p2.draw()
p1.draw=draw2
p1.draw(p1)
Run Code Online (Sandbox Code Playgroud)

当我运行此代码时,会生成以下输出:

1 2
3 4
Traceback (most recent call last):
  File "main.py", line 17, in <module>
    p1.draw(p1)
  File "main.py", line 10, in draw2
    print("x",self.__x, "y", self.__y)
AttributeError: 'Point' object has no attribute '__x'
Run Code Online (Sandbox Code Playgroud)

为什么我不能在更改p1.draw()之后更改它以使其指向draw2?

python class object

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

面向对象访问说明符的推理

我有一个关于面向对象访问说明符的原因的一般问题.我从来没有完全理解为什么它们存在的原因,只是认为它们是作为一种非常基本的代码安全形式存在但是在查看了这个线程的讨论之后

Python在类中有"私有"变量吗?

我知道我完全错了,他们根本没有帮助安全.那些访问说明符只是被认为是面向对象设计中的良好编程实践吗?当我们说私人或受保护时,究竟是谁保护数据字段或类或方法?人们是否仍然可以访问已经知道它的方法?通过反思等方法?

我很抱歉,如果这个问题看起来很基本或有点元抄袭,但它总是困扰我,我不太清楚其中一个主要的OOP封装概念的确切推理.

python java oop

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

在python类中实现树的递归函数

我创建了一个类Tree和一个类Node.现在我需要实现preOrder,postOrderinOrder遍历.我是用私人功能做的.但有没有办法只使用一个函数来做同样的事情?

class Node:
    def __init__(self, data):
        self.left = None
        self.right = None
        self.data = data

class Tree:
    def __init__(self):
        self.root = None

    # Private helper functions
    def __insert(self, data, root):
        if data < root.data:
            if root.left is None:
                root.left = Node(data)
            else:
                self.__insert(data, root.left)
        elif data >= root.data:
            if root.right is None:
                root.right = Node(data)
            else:
                self.__insert(data, root.right)

    # Traversals
    def __preOrder(self, root):
        print root.data
        if root.left:
            self.__preOrder(root.left)
        if root.right: …
Run Code Online (Sandbox Code Playgroud)

python tree recursion python-2.7

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

hasattr 不断返回 False

class Avatar:

    def __init__(self, HP=100, damage=10, defends=10, magic=5):
        self.__hp = HP
        self.__dam = damage
        self.__def = defends
        self.__mag = magic

    def check_hasattr(self):
        print hasattr(Avatar,'__hp')

warrior = Avatar(99,9,9,4)
Avatar.check_hasattr(warrior)
Run Code Online (Sandbox Code Playgroud)

有人知道为什么我期望的print语句会返回吗?FalseTrue

python hasattr

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

如何将 PIL.ImageTk.PhotoImage 保存为 jpg

我想将 PIL.ImageTk.PhotoImage 保存到文件中。我的方法是创建一个“打开”文件并调用“写入”方法,但它不起作用,因为我不知道如何从对象获取字节数组。

def store_temp_image(data, image):
    new_file_name = data.number + ".jpg"
    with open(os.path.join("/tmp/myapp", new_file_name), mode='wb+') as output:
        output.write(image)
Run Code Online (Sandbox Code Playgroud)

错误信息如下:

TypeError: a bytes-like object is required, not 'PhotoImage'
Run Code Online (Sandbox Code Playgroud)

我通常会找到将 ImageTk 对象转换为 PIL 对象的方法,但反之则不然。从文档中我也无法得到任何提示。

python python-imaging-library

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

创建矩形类

我真的不太了解课程,任何帮助都会很棒。

\n\n

矩形类应具有以下私有数据属性:

\n\n
    \n
  • __length
  • \n
  • __width
  • \n
\n\n

Rectangle 类应该有一个 __init__方法来创建这些属性并将它们初始化为 1。它还应该有以下方法:

\n\n
    \n
  • set_length__length\xe2\x80\x93 该方法为字段赋值

  • \n
  • set_width__width\xe2\x80\x93 该方法为字段赋值

  • \n
  • get_length__length\xe2\x80\x93 该方法返回字段的值

  • \n
  • get_width__width\xe2\x80\x93 该方法返回字段的值

  • \n
  • get_area\xe2\x80\x93 该方法返回 Rectangle 的面积

  • \n
  • __str__\xe2\x80\x93 该方法返回对象\xe2\x80\x99s 状态

  • \n
\n\n

\n\n

class Rectangle:\n\n  def __init__(self):\n      self.set_length = 1\n      self.set_width = 1\n      self.get_length = 1\n      self.get_width = 1\n      self.get_area = 1\n\ndef get_area(self):\n    self.get_area = self.get_width * self.get_length\n    return self.get_area\n\n\ndef main():\n\n  my_rect = …
Run Code Online (Sandbox Code Playgroud)

python class

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

在Python中避免实现getter函数是不好的做法?

我正在研究一个Python项目,因为可以通过指定class.variablename直接访问实例变量名,所以我想知道是否建议实现相同的getter函数.我没有将变量声明为私有.

python

0
推荐指数
1
解决办法
91
查看次数

试图以面向对象的方式传递类和函数中的变量列表

我试图以面向对象的方式在Class和Function中传递变量列表但面临一些错误,我不明白它有什么问题我在Eclipse中使用PyDev

class Mydetails:
    __details = ''

    def __init__(self,details):     # constructor
        #self.__details['country'] = details['country']
        self.__details = details

    def set_element(self,details):
        self.__details = details

    def get_list(self,details):
        return self.__details

details = ['ABC','DEF','GHI','JKL']
pdetails = Mydetails()
pdetails.set_element(details)
print(pdetails.get_list())
Run Code Online (Sandbox Code Playgroud)

OUTPUT

Traceback (most recent call last):
  File "C:\workspace\python\pythonapp\list.py", line 18, in <module>
    pdetails = Mydetails()
TypeError: __init__() missing 1 required positional argument: 'details'
Run Code Online (Sandbox Code Playgroud)

python oop python-3.x

0
推荐指数
1
解决办法
3605
查看次数

你可以在分配默认参数时使用self吗?

我试图将一些Java代码转换为python等价物,以便我可以在两者之间进行接口.所以在Java中我有一些像这样的代码:

public int[] toArray(boolean order) {
    return toArray(order, this.length());
}
public int[] toArray(boolean order, int length) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

并且python中的逻辑等效项可能如下所示:

def to_array(self, order):
  return self.to_array(order, self.length())
def to_array(self, order, length):
  ...
Run Code Online (Sandbox Code Playgroud)

除了... python不允许函数重载,相反它允许默认参数,所以,再次,你想要做这样的事情似乎合乎逻辑:

def to_array(self, order, length = self.length()):
  ...
Run Code Online (Sandbox Code Playgroud)

但是...这在python中也是不允许的,可能因为self直到函数体内才真正"存在".

那么在python中执行此操作的正确方法是什么?或者它是不可能的?

编辑:我意识到我在我的java代码中使用了void函数,它应该返回一个值,所以现在它们返回 int[]

python

0
推荐指数
1
解决办法
28
查看次数