我正在编写一个程序,其中im使用两个主要函数,但是这两个函数都使用相同的内部函数。我想知道如何以大多数pythonic方式编写它们?我的观点是将那些帮助程序隐藏在内部某处,并且不要重复帮助程序功能。
def main_function1():
helper1()
helper2()
#dowork1
def main_function2()
helper1()
helper2()
#dowork2
def helper1()
#workhelp1
def helper2()
#workhelp2
Run Code Online (Sandbox Code Playgroud)
我能找出的唯一合理的解决方案是用..私有函数声明静态类?但是由于:
Strictly speaking, private methods are accessible outside their class,
just not easily accessible. Nothing in Python is truly private[...]
Run Code Online (Sandbox Code Playgroud)
我陷入困境,没有想法。
来自:http : //www.faqs.org/docs/diveintopython/fileinfo_private.html
我也考虑过使用内部帮助程序和切换程序声明一个主要功能,以确定要运行哪个功能,但是我想那是很差的解决方案。
现在,我发现最准确的唯一方法是将普通类声明为:
Strictly speaking, private methods are accessible outside their class,
just not easily accessible. Nothing in Python is truly private[...]
Run Code Online (Sandbox Code Playgroud)
输出:
#first function#
first helper
second helper
#second function#
first helper
second helper
###
first …Run Code Online (Sandbox Code Playgroud) 在 Javascript 中,有什么方法可以导入(或要求)一个模块没有从该模块导出的对象?
我意识到这可能是不好的做法,但我想知道这是否可能。我有 Python 背景,所以我对我可以导入模块但无法在 Javascript 中访问其所有数据元素的想法感到困惑。
我试图了解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应用程序中有一个静态方法模块。这些方法使用了很多私有(例如:“__do_sub_task2(**args)”)我想在这个模块中为这些私有静态方法编写单元测试,但我收到了引用错误。
有没有办法做到这一点?
更新:添加场景
我有一个名为“my_module.py”的模块文件,该文件的内容如下:
def public_method_foo(my_number):
return __sub_method_bar(my_number * 10)
def __sub_method_bar(other_number)
return other_number + 11
Run Code Online (Sandbox Code Playgroud)
更新 #2 我问这个问题的原因是因为我有一个与上面类似的场景,但是当我将以下引用添加到我的 test.py 模块文件时:
from my_module import __sub_method_bar
Run Code Online (Sandbox Code Playgroud)
并尝试在我的测试中使用它,我的测试中出现以下异常
全局名称 '_MyTests__sub_method_bar' 未定义
一个类在多大程度上可以"保护"其中一个属性来自外部访问?
例如,具有常规_secret属性的类,可以轻松访问原始值:
class Paranoid(object):
def __init__(self):
self._secret = 0
def set(self, val):
self._secret = val * 10
def get(self):
return self._secret / 10
p = Paranoid()
p.set(123)
print p.get() # 123
print p._secret # 1230, should be inaccessible
Run Code Online (Sandbox Code Playgroud)
如何使访问_secret变得更加困难?
对此没有实际的应用,我只是好奇是否有新的方法使其更难访问(在Python的上下文中 - 所以忽略了你可以把调试器附加到Python进程并检查内存的事实)
是否可以调用在另一个类中声明的私有函数?如果是,我需要在我的主文件中调用一个函数。这个函数必须从另一个模块导入。这个函数在一个类中定义如下。
class ConfLoader(object):
.....
def _set_config_value(self, section, attribute, value):
....
Run Code Online (Sandbox Code Playgroud)
有什么建议 ?
我真的不太了解课程,任何帮助都会很棒。
\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中将受保护的方法放在哪里以及它们应该是私有的_method(self)还是公共的method(self)。我知道 Python 不提供受保护方法的语言功能。
私有:按照约定,以下划线开头的属性是私有的。通常仍然可以从外部访问它们,但不应该。用下划线开头的受保护方法感觉很奇怪,因为不清楚子类实际上重写了该方法而不是声明它自己的实现细节。
Public:没有下划线,更有可能有人会查看基类以查看该方法是否已经存在。因此,这对于子类化的人来说更好。然而,想要使用子类的人不知道该方法只是一个实现细节,可能会尝试从外部调用它。
在 Python 中定义受保护方法的首选方法是什么?
你如何使用我希望传递关键字参数的函数的名称?
例如,我有以下功能:
def func(keyword1='A'):
print keyword1
Run Code Online (Sandbox Code Playgroud)
我可以做这个:
func.__name__
>> 'func'
Run Code Online (Sandbox Code Playgroud)
但是,我想这样做:
func(keyword1='B').__name__
>>> 'func'
Run Code Online (Sandbox Code Playgroud)
我想这样做的原因是因为我有另一种方法将该函数作为参数接受,它需要拉出函数的名称并使用不同的关键字运行该函数.
所以,我真正想要做的就是让这个功能起作用:
def Function_Name_And_Result(x):
print x.__name__ + x()
Function_Name_And_Result(func(keyword1='B'))
>> funcB
Run Code Online (Sandbox Code Playgroud) 我是java的新手.
在java中我们会有类似的东西
public void func1()
{
func2();
}
private void func2(){}
Run Code Online (Sandbox Code Playgroud)
但是,在python我想要相当于
def func1(self):
self.func2("haha")
pass
def func2(str):
pass
Run Code Online (Sandbox Code Playgroud)
它抛出了一个错误,只需要1个参数(给定2个)
我已经检查了使用等解决方案
def func1(self):
self.func2("haha")
pass
@classmethod
def func2(str):
pass
Run Code Online (Sandbox Code Playgroud)
但它不起作用
在func2中取出self会使全局名称func2无法定义.
我如何完全解决这种情况.
我几个月来一直在尝试学习使用python 3进行编程,但我陷入了课堂困境。特别是私有和公共方法。
我不明白什么是专用方法。我知道公共方法可以由用户/程序直接访问。但是我无法理解私有方法,它们的用途以及它们为什么存在。
我对Stackoverflow进行了大量研究,但没有找到任何答案。因此,如果这是重复的事,我事先表示歉意。
python ×12
class ×4
python-3.x ×2
function ×1
import ×1
inheritance ×1
java ×1
javascript ×1
methods ×1
object ×1
oop ×1
protected ×1
unit-testing ×1