相关疑难解决方法(0)

静态类变量是否可能?

是否有可能在python中有静态类变量或方法?这样做需要什么语法?

python oop static class class-variables

1824
推荐指数
20
解决办法
114万
查看次数

Python中的静态方法?

是否有可能在Python中使用静态方法,因此我可以在不初始化类的情况下调用它们,例如:

ClassName.static_method()
Run Code Online (Sandbox Code Playgroud)

python static-methods

1639
推荐指数
7
解决办法
93万
查看次数

@classmethod和@staticmethod对初学者的意义?

有人可以向我解释@classmethod@staticmethodpython中的含义吗?我需要知道差异和意义.

据我所知,@classmethod告诉一个类,它是一个应该继承到子类的方法,或者......某种东西.但是,重点是什么?为什么不在不添加@classmethod或定义@staticmethod任何@定义的情况下定义类方法?

tl; dr: 我应该何时使用它们,为什么要使用它们,我应该如何使用它们?

我在C++方面非常先进,所以使用更高级的编程概念应该不是问题.如果可能的话,请随意给我一个相应的C++示例.

python oop static-methods class-method

1532
推荐指数
7
解决办法
59万
查看次数

在Python中创建单例

这个问题不是讨论单身人士设计模式是否可取,反模式,还是任何宗教战争,而是讨论如何以最蟒蛇的方式在Python中最好地实现这种模式.在这种情况下,我将"最pythonic"定义为表示它遵循"最小惊讶原则".

我有多个类可以成为单例(我的用例是记录器,但这并不重要).当我可以简单地继承或装饰时,我不希望在添加gumph的几个类中混乱.

最好的方法:


方法1:装饰者

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)

优点

  • 装饰器的添加方式通常比多重继承更直观.

缺点

  • 虽然使用MyClass()创建的对象将是真正的单例对象,但MyClass本身是一个函数,而不是一个类,因此您无法从中调用类方法.也是为了m = MyClass(); n = MyClass(); o = type(n)();那时m == n && m != o && n != o

方法2:基类

class 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 singleton metaclass decorator base-class

829
推荐指数
14
解决办法
29万
查看次数

TypeError:缺少1个必需的位置参数:'self'

我是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 python-3.x

168
推荐指数
6
解决办法
58万
查看次数

在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新手.有人可以解释为什么人们想要定义静态方法吗?或者,为什么并非所有方法都定义为静态方法?

python

73
推荐指数
6
解决办法
3万
查看次数

模块函数vs staticmethod vs classmethod vs no decorators:哪个成语更pythonic?

我是一名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?各自的优点和缺点是什么?

这是我到目前为止所理解的:

模块功能:

  • 避免Foo.Foo.f()问题
  • 污染模块的命名空间比替代方案更多
  • 没有继承

静态方法:

  • 保持类中与类相关的函数以及模块命名空间之外的函数.
  • 允许在类的实例上调用该函数.
  • 子类可以覆盖该方法.

类方法:

  • 与staticmethod相同,但也将类作为第一个参数传递.

常规方法(仅限Python 3):

  • 与staticmethod相同,但不能在类的实例上调用该方法.

我是否想过这个?这不是问题吗?请帮忙!

python static-methods

65
推荐指数
3
解决办法
2万
查看次数

设置外键属性的默认值

为模型中的外键字段设置默认值的最佳方法是什么?假设我有两个模型,学生和考试,学生将考试作为外键.我如何理想地为它设置默认值?这是我的努力记录

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)

这里开始,但在同步时失败并且表不存在错误.

任何帮助,将不胜感激.

django default foreign-keys

57
推荐指数
6
解决办法
6万
查看次数

如何处理pylint消息:警告:方法可以是一个函数

我有一个python类并对它运行pylint.它给出的一条信息是:

Warning: Method could be a function
Run Code Online (Sandbox Code Playgroud)

这是否告诉我,将此方法移出类是更好的,因为它不使用任何实例变量?

在C#中,我会将其设为静态方法.在这里做什么最蟒蛇的事情?

python oop pylint

56
推荐指数
1
解决办法
3万
查看次数

Python类静态方法

我想创建一种实用程序类,它只包含可由名称类前缀调用的静态方法.看起来我做错了什么:)

这是我的小班:

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).

这里有一些问题:

  1. 我究竟做错了什么?静态方法不应该通过classname调用吗?
  2. 我真的需要一个实用程序类,还是有其他方法可以在Python中实现相同的功能?
  3. 如果我尝试更改main中的代码,我会得到: TypeError: GetFilePath() takes exactly 1 argument (2 given)

新的main:

from FileUtility import *
def main():
    objFile = FileUtility()
    path …
Run Code Online (Sandbox Code Playgroud)

python static

55
推荐指数
3
解决办法
7万
查看次数