Tag: 静态方法

Python装饰器作为一种静态方法

我想写一个python类,它使用需要实例状态信息的装饰器函数。 这是按预期工作,但如果我明确地使装饰器staticmetod,我得到以下错误: Traceback (most recent call last): File "tford.py", line 1, in <module> class TFord(object): File "tford.py", line 14, in TFord @ensure_black TypeError: 'staticmethod' object is not callable 为什么? 这里是代码: class TFord(object): def __init__(self, color): self.color = color @staticmethod def ensure_black(func): def _aux(self, *args, **kwargs): if self.color == 'black': return func(*args, **kwargs) else: return None […]

我如何dynamic创build一个类的python类方法

如果我定义一个小Python程序 class a(): def _func(self): return "asdf" # Not sure what to resplace __init__ with so that a.func will return asdf def __init__(self, *args, **kwargs): setattr(self, 'func', classmethod(self._func)) if __name__ == "__main__": a.func 我收到跟踪错误 Traceback (most recent call last): File "setattr_static.py", line 9, in <module> a.func AttributeError: class a has no attribute 'func' 我想弄清楚的是,我怎样才能dynamic地将类方法设置为一个类,而不需要实例化一个对象呢? 编辑: […]

模块函数vs静态方法vs类方法vs无装饰器:哪个习语更pythonic?

我是一个Java开发人员,他是用Python来玩弄和开发的。 我最近偶然发现了这篇文章 ,其中提到了Java程序员拿起Python时所犯的常见错误。 第一个引起了我的注意: Java中的静态方法不会转换为Python类方法。 哦,当然,它的效果差不多,但是classmethod的目标实际上是做一些在Java中通常不可能的事情(比如inheritance一个非默认的构造函数)。 Java静态方法的惯用翻译通常是模块级函数,而不是类方法或静态方法。 (而静态最终字段应该转换为模块级别的常量。 这不是一个性能问题,但是一个Python程序员必须像这样使用Java-idiom代码,当inputFoo.Foo.someMethod的时候,应该只是Foo.someFunction而非常恼火。 但是请注意,调用一个classmethod涉及一个额外的内存分配,调用静态方法或函数不会。 哦,所有那些Foo.Bar.Baz属性链也不是免费的。 在Java中,这些虚线名称是由编译器查找的,所以在运行时,它们有多less个并不重要。 在Python中,查找在运行时发生,所以每个点都是重要的。 (请记住,在Python中,“Flat比嵌套更好”,但它与“Readability counts”和“Simple比复杂”更相关,而不是关于性能。 我发现这有点奇怪,因为staticmethod的文档说: Python中的静态方法类似于Java或C ++中的方法。 另请参见classmethod(),该类对于创build备用类构造函数非常有用。 更令人费解的是,这个代码: class A: def foo(x): print(x) A.foo(5) 在Python 2.7.3中失败,但在3.2.3中正常工作(虽然你不能在A的实例上调用方法,只能在类上调用)。 所以有三种方法来实现静态方法(如果使用classmethod方法,则有四种方法),每种方法都有细微的差别,其中一种看似没有logging。 这似乎与Python的口头禅不一致。 应该有一个 – 最好只有一个 – 明显的方法来做到这一点。 哪个成语是Pythonic最? 各有什么优点和缺点? 以下是我目前所了解的内容: 模块function: 避免Foo.Foo.f()问题 污染模块的名称空间比替代品多 没有inheritance 静态方法: 在类中保持与类有关的function,并在模块名称空间之外。 允许在类的实例上调用该函数。 子类可以覆盖该方法。 类方法: 与staticmethod相同,但也传递类作为第一个参数。 常规方法(仅限Python 3) : 与静态方法相同,但不能调用该类的实例的方法。 我是否在意这个? 这是一个非问题? 请帮忙!

在静态函数中使用这个失败

我有这个方法,我想使用$ this,但我得到的是:致命的错误:使用$ this时不在对象上下文中。 我怎样才能使这个工作? public static function userNameAvailibility() { $result = $this->getsomthin(); }

我怎么知道这个C#方法是线程安全的?

我正在创build一个ASP.NETcaching项删除事件的callback函数。 文档说,我应该调用一个对象的方法或我知道会存在的调用(将在范围内),如静态方法,但它说我需要确保静态是线程安全的。 第一部分:我可以做些什么事情让事情变得不安全? 第2部分:这是否意味着,如果我有 static int addOne(int someNumber){ int foo = someNumber; return foo +1; } 我叫Class.addOne(5); 和Class.addOne(6); 同时,我可能得到6或7返回取决于哪些调用集foo第一? (即比赛条件)

PHP可以静态::取代自我::?

我对这件事有点困惑。 我正在devise一个ORM类,它试图在Ruby on Rails上与ActiveRecord非常类似,但这不是重点。 我想说的是我的类广泛使用静态属性inheritance,特别是数据库和表处理。 我的问题是,我应该使用self ::吗?

在C ++中声明但未定义的静态函数

我使用C ++从下面的代码中得到一个错误。 Main.cpp的 #include "file.h" int main() { int k = GetInteger(); return 0; } File.h static int GetInteger(); File.cpp #include "file.h" static int GetInteger() { return 1; } 我得到的错误: Error C2129: static function 'int GetInteger(void)' declared but not defined. 我读过着名的文章“组织代码文件在C和C + +” ,但不明白这个代码有什么问题。

Python的静态方法 – 如何从另一个方法调用一个方法

当我有一个常规的方法来调用另一个方法,我不得不这样做 class test: def __init__(self): pass def dosomething(self): print "do something" self.dosomethingelse() def dosomethingelse(self): print "do something else" 但是当我有静态方法,我不能写 self.dosomethingelse() 因为没有实例。 在Python中如何从同一个类的另一个静态方法中调用静态方法? 编辑:多么混乱。 好吧,我编辑回到原来的问题。 我已经对Peter Hansen的评论中的第二个问题有了答案。 如果你认为我应该打开另一个问题,我已经有了答案,请告诉我。

静态方法和实例方法之间的区别

我正在阅读教材中给我的文字,我不太确定我明白这是什么意思。 这基本上告诉我,静态方法或类方法包括“修饰符”关键字静态。 但我真的不知道这是什么意思? 有人能请真正简单的解释静态或类方法是什么? 另外,我可以得到一个简单的解释什么样的实例方法? 这是他们在教科书中给我的: 存在或不存在静态修饰符有重要的实际意义。 一旦Java处理了它所属类的定义,就可以调用和执行公共类方法。 实例方法不是这种情况。 在公共实例方法可能被调用和执行之前,必须为其所属的类创build一个实例。 要使用公共类方法,您只需要该类。 另一方面,在你使用公共实例方法之前,你必须有一个类的实例。 在另一个方法的定义中调用静态方法的方式根据两个方法是否属于同一个类而不同。 在上面的例子中,factorial和main都是MainClass类的两个方法。 因此,在main定义中调用阶乘仅仅引用方法名“factorial”。

Kotlin中的静态扩展方法

你如何在Kotlin中定义一个静态的扩展方法? 这甚至有可能吗? 我目前有一个扩展方法如下所示。 public fun Uber.doMagic(context: Context) { // … } 上面的扩展可以在一个实例上调用。 uberInstance.doMagic(context) // Instance method 但是我如何使它静态方法如下所示。 Uber.doMagic(context) // Static or class method