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中的绑定方法,并实现了以下代码:
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?
我有一个关于面向对象访问说明符的原因的一般问题.我从来没有完全理解为什么它们存在的原因,只是认为它们是作为一种非常基本的代码安全形式存在但是在查看了这个线程的讨论之后
我知道我完全错了,他们根本没有帮助安全.那些访问说明符只是被认为是面向对象设计中的良好编程实践吗?当我们说私人或受保护时,究竟是谁保护数据字段或类或方法?人们是否仍然可以访问已经知道它的方法?通过反思等方法?
我很抱歉,如果这个问题看起来很基本或有点元抄袭,但它总是困扰我,我不太清楚其中一个主要的OOP封装概念的确切推理.
我创建了一个类Tree和一个类Node.现在我需要实现preOrder,postOrder并inOrder遍历.我是用私人功能做的.但有没有办法只使用一个函数来做同样的事情?
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) 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
我想将 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 对象的方法,但反之则不然。从文档中我也无法得到任何提示。
我真的不太了解课程,任何帮助都会很棒。
\n\n矩形类应具有以下私有数据属性:
\n\n__length __widthRectangle 类应该有一个 __init__方法来创建这些属性并将它们初始化为 1。它还应该有以下方法:
set_length__length\xe2\x80\x93 该方法为字段赋值
set_width__width\xe2\x80\x93 该方法为字段赋值
get_length__length\xe2\x80\x93 该方法返回字段的值
get_width__width\xe2\x80\x93 该方法返回字段的值
get_area\xe2\x80\x93 该方法返回 Rectangle 的面积
__str__\xe2\x80\x93 该方法返回对象\xe2\x80\x99s 状态
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.variablename直接访问实例变量名,所以我想知道是否建议实现相同的getter函数.我没有将变量声明为私有.
我试图以面向对象的方式在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)
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) 我试图将一些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[]