有人可以向我解释@classmethod和@staticmethodpython中的含义吗?我需要知道差异和意义.
据我所知,@classmethod告诉一个类,它是一个应该继承到子类的方法,或者......某种东西.但是,重点是什么?为什么不在不添加@classmethod或定义@staticmethod任何@定义的情况下定义类方法?
tl; dr: 我应该何时使用它们,为什么要使用它们,我应该如何使用它们?
我在C++方面非常先进,所以使用更高级的编程概念应该不是问题.如果可能的话,请随意给我一个相应的C++示例.
selfPython 中这个词的目的是什么?我理解它指的是从该类创建的特定对象,但我不明白为什么它明确需要作为参数添加到每个函数.为了说明,在Ruby中我可以这样做:
class myClass
def myFunc(name)
@name = name
end
end
Run Code Online (Sandbox Code Playgroud)
我很容易理解.但是在Python中我需要包括self:
class myClass:
def myFunc(self, name):
self.name = name
Run Code Online (Sandbox Code Playgroud)
谁能跟我说说这个?这不是我在(无可否认的有限)经历中遇到的事情.
如果我有以下python代码:
class Foo(object):
bar = 1
def bah(self):
print(bar)
f = Foo()
f.bah()
Run Code Online (Sandbox Code Playgroud)
它抱怨
NameError: global name 'bar' is not defined
Run Code Online (Sandbox Code Playgroud)
如何bar在方法中访问类/静态变量bah?
我有Python类,其中我在运行时只需要一个实例,因此每个类只有一次属性就足够了,而不是每个实例.如果存在多个实例(不会发生),则所有实例都应具有相同的配置.我想知道以下哪个选项会更好或更"惯用"Python.
类变量:
class MyController(Controller):
path = "something/"
children = [AController, BController]
def action(self, request):
pass
Run Code Online (Sandbox Code Playgroud)
实例变量:
class MyController(Controller):
def __init__(self):
self.path = "something/"
self.children = [AController, BController]
def action(self, request):
pass
Run Code Online (Sandbox Code Playgroud) 这是我的第一个问题,很抱歉......我是python和编码的初学者,我想创建一个名为'Map'的类,它将具有以下类变量:
class Map:
height = 11
width = 21
top = [['#']*width]
middle = [['#']+[' ']*(width-2)+['#'] for i in range(height-2)]
field = top + middle + top
b = Map()
Shell:
>>> middle = [['#']+[' ']*(width-2)+['#'] for i in range(height-2)]
NameError: name 'width' is not defined
Run Code Online (Sandbox Code Playgroud)
如果我将变量放在类之外就可以了.我究竟做错了什么??
谢谢您的帮助.
如果这是一个愚蠢的问题,我深表歉意,但我还没有找到解决此问题的优雅解决方法。基本上,当使用 concurent.futures 模块时,类的非静态方法看起来应该可以正常工作,我在模块的文档中没有看到任何表明它们无法正常工作的内容,并且该模块不会产生任何结果运行时出现错误 - 在许多情况下甚至会产生预期的结果!
但是,我注意到该模块似乎不尊重在父线程中进行的可迭代字段的更新,即使这些更新发生在启动任何子进程之前也是如此。这是我的意思的一个例子:
import concurrent.futures
class Thing:
data_list = [0, 0, 0]
data_number = 0
def foo(self, num):
return sum(self.data_list) * num
def bar(self, num):
return num * self.data_number
if __name__ == '__main__':
thing = Thing()
thing.data_list[0] = 1
thing.data_number = 1
with concurrent.futures.ProcessPoolExecutor() as executor:
results = executor.map(thing.foo, range(3))
print('result of changing list:')
for result in results:
print(result)
results = executor.map(thing.bar, range(3))
print('result of changing number:')
for result in results:
print(result)
Run Code Online (Sandbox Code Playgroud)
我希望这里的结果是
result of changing list: …Run Code Online (Sandbox Code Playgroud) python iterable multiprocessing non-static concurrent.futures
python ×6
class ×3
oop ×2
class-method ×1
iterable ×1
member ×1
non-static ×1
python-3.x ×1
self ×1
static ×1
variables ×1