是否有可能在python中有静态类变量或方法?这样做需要什么语法?
是否有可能在Python中使用静态方法,因此我可以在不初始化类的情况下调用它们,例如:
ClassName.static_method()
Run Code Online (Sandbox Code Playgroud) 有人可以向我解释@classmethod和@staticmethodpython中的含义吗?我需要知道差异和意义.
据我所知,@classmethod告诉一个类,它是一个应该继承到子类的方法,或者......某种东西.但是,重点是什么?为什么不在不添加@classmethod或定义@staticmethod任何@定义的情况下定义类方法?
tl; dr: 我应该何时使用它们,为什么要使用它们,我应该如何使用它们?
我在C++方面非常先进,所以使用更高级的编程概念应该不是问题.如果可能的话,请随意给我一个相应的C++示例.
这个问题不是讨论单身人士设计模式是否可取,反模式,还是任何宗教战争,而是讨论如何以最蟒蛇的方式在Python中最好地实现这种模式.在这种情况下,我将"最pythonic"定义为表示它遵循"最小惊讶原则".
我有多个类可以成为单例(我的用例是记录器,但这并不重要).当我可以简单地继承或装饰时,我不希望在添加gumph的几个类中混乱.
最好的方法:
def singleton(class_):
instances = {}
def getinstance(*args, **kwargs):
if class_ not in instances:
instances[class_] = class_(*args, **kwargs)
return instances[class_]
return getinstance
@singleton
class MyClass(BaseClass):
pass
Run Code Online (Sandbox Code Playgroud)
优点
缺点
m = MyClass(); n = MyClass(); o = type(n)();那时m == n && m != o && n != oclass Singleton(object):
_instance = None
def __new__(class_, *args, **kwargs):
if not isinstance(class_._instance, class_):
class_._instance = object.__new__(class_, *args, **kwargs)
return class_._instance
class MyClass(Singleton, …Run Code Online (Sandbox Code Playgroud) 我是python的新手,已经撞墙了.我遵循了几个教程,但无法通过错误:
Traceback (most recent call last):
File "C:\Users\Dom\Desktop\test\test.py", line 7, in <module>
p = Pump.getPumps()
TypeError: getPumps() missing 1 required positional argument: 'self'
Run Code Online (Sandbox Code Playgroud)
我检查了几个教程,但似乎与我的代码没有任何不同.我唯一能想到的是python 3.3需要不同的语法.
主要内容:
# test script
from lib.pump import Pump
print ("THIS IS A TEST OF PYTHON") # this prints
p = Pump.getPumps()
print (p)
Run Code Online (Sandbox Code Playgroud)
泵类:
import pymysql
class Pump:
def __init__(self):
print ("init") # never prints
def getPumps(self):
# Open database connection
# some stuff here that never gets executed because of error
Run Code Online (Sandbox Code Playgroud)
如果我理解正确,"self"会自动传递给构造函数和方法.我在这做错了什么?
我使用的是Windows 8和python …
我在代码中遇到了python中的未绑定方法错误
class Sample(object):
'''This class defines various methods related to the sample'''
def drawSample(samplesize,List):
sample=random.sample(List,samplesize)
return sample
Choices=range(100)
print Sample.drawSample(5,Choices)
Run Code Online (Sandbox Code Playgroud)
在这里阅读了很多有用的帖子之后,我想到了如何在上面添加@staticmethod以使代码正常工作.我是python新手.有人可以解释为什么人们想要定义静态方法吗?或者,为什么并非所有方法都定义为静态方法?
我是一名Java开发人员,他开玩笑地玩弄Python.我最近偶然发现了这篇文章,其中提到了Java程序员在学习Python时常犯的错误.第一个引起了我的注意:
Java中的静态方法不能转换为Python类方法.哦,当然,它会产生或多或少相同的效果,但类方法的目标实际上是做一些在Java中通常甚至不可能的事情(比如继承非默认的构造函数).Java静态方法的惯用翻译通常是模块级函数,而不是类方法或静态方法.(静态最终字段应转换为模块级常量.)
这不是一个性能问题,但是一个必须使用Java-idiom代码的Python程序员会因为输入Foo.Foo.someMethod而感到非常烦恼,因为它应该只是Foo.someFunction.但请注意,调用classmethod涉及额外的内存分配,调用static方法或函数不会.
哦,所有那些Foo.Bar.Baz属性链也不是免费的.在Java中,编译器会查找那些带点名称的名称,因此在运行时,它们中有多少名称并不重要.在Python中,查找在运行时发生,因此每个点都很重要.(请记住,在Python中,"Flat优于嵌套",虽然它与"可读性计数"和"简单优于复杂"相关,而不是与性能有关.)
我发现这有点奇怪,因为staticmethod的文档说:
Python中的静态方法与Java或C++中的静态方法类似.另请参阅classmethod()以获取对创建备用类构造函数有用的变体.
更令人费解的是这段代码:
class A:
def foo(x):
print(x)
A.foo(5)
Run Code Online (Sandbox Code Playgroud)
在Python 2.7.3中按预期失败,但在3.2.3中工作正常(尽管你不能在A的实例上调用该方法,只能在类上调用.)
因此,有三种方法可以实现静态方法(如果使用classmethod计算,则有四种方法),每种方法都有细微差别,其中一种看似无法记录.这似乎与Python的口头禅是不一致的应该有一个 - 最好只有一个 - 明显的方式来做到这一点.哪个成语是最Pythonic?各自的优点和缺点是什么?
这是我到目前为止所理解的:
模块功能:
静态方法:
类方法:
常规方法(仅限Python 3):
我是否想过这个?这不是问题吗?请帮忙!
为模型中的外键字段设置默认值的最佳方法是什么?假设我有两个模型,学生和考试,学生将考试作为外键.我如何理想地为它设置默认值?这是我的努力记录
class Student(models.Model):
....
.....
exam_taken = models.ForeignKey("Exam", default=1)
Run Code Online (Sandbox Code Playgroud)
工作,但有一个预感有一个更好的方法.
def get_exam():
return Exam.objects.get(id=1)
class Student(models.Model):
....
.....
exam_taken = models.ForeignKey("Exam", default=get_exam)
Run Code Online (Sandbox Code Playgroud)
从这里开始,但在同步时失败并且表不存在错误.
任何帮助,将不胜感激.
我有一个python类并对它运行pylint.它给出的一条信息是:
Warning: Method could be a function
Run Code Online (Sandbox Code Playgroud)
这是否告诉我,将此方法移出类是更好的,因为它不使用任何实例变量?
在C#中,我会将其设为静态方法.在这里做什么最蟒蛇的事情?
我想创建一种实用程序类,它只包含可由名称类前缀调用的静态方法.看起来我做错了什么:)
这是我的小班:
class FileUtility():
@staticmethod
def GetFileSize(self, fullName):
fileSize = os.path.getsize(fullName)
return fileSize
@staticmethod
def GetFilePath(self, fullName):
filePath = os.path.abspath(fullName)
return filePath
Run Code Online (Sandbox Code Playgroud)
现在我的"主要"方法:
from FileUtility import *
def main():
path = 'C:\config_file_list.txt'
dir = FileUtility.GetFilePath(path)
print dir
Run Code Online (Sandbox Code Playgroud)
我收到一个错误:unbound method GetFilePath() must be called with FileUtility instance as first argument (got str instance instead).
这里有一些问题:
TypeError: GetFilePath() takes exactly 1 argument (2 given)新的main:
from FileUtility import *
def main():
objFile = FileUtility()
path …Run Code Online (Sandbox Code Playgroud) python ×9
oop ×3
static ×2
base-class ×1
class ×1
class-method ×1
decorator ×1
default ×1
django ×1
foreign-keys ×1
metaclass ×1
pylint ×1
python-3.x ×1
singleton ×1