精华内容
下载资源
问答
  • Python中的静态变量

    2021-07-16 13:35:38
    Is it possible to have static class variables or methods in python? What syntax is required to do this?解决方案Variables declared inside the class definition, but not inside a method are class or ...

    Is it possible to have static class variables or methods in python? What syntax is required to do this?

    解决方案

    Variables declared inside the class definition, but not inside a method are class or static variables:

    >>> class MyClass:

    ... i = 3

    ...

    >>> MyClass.i

    3

    As @millerdev points out, this creates a class-level "i" variable, but this is distinct from any instance-level "i" variable, so you could have

    >>> m = MyClass()

    >>> m.i = 4

    >>> MyClass.i, m.i

    >>> (3, 4)

    This is different from C++ and Java, but not so different from C#, where a static member can't be accessed using a reference to an instance.

    @Steve Johnson has already answered regarding static methods, also documented under "Built-in Functions" in the Python Library Reference.

    class C:

    @staticmethod

    def f(arg1, arg2, ...): ...

    @beidy recommends classmethods over staticmethod, as the method then receives the class type as the first argument, but I'm still a little fuzzy on the advantages of this approach over staticmethod. If you are too, then it probably doesn't matter.

    展开全文
  • 如何在Python中使用静态变量来计数。然后,就在网上一通查找,找的方法都是利用类的方法来实现静态变量。说实话没有看太懂,另外我想如果用类成员当做静态变量来计数是不是很麻烦,我们还要编写ADD()函数,来实现加1...

    今天,在用Python写一个统计一个文件下有多少文件的小标本时,遇到了一个很棘手的问题。如何在Python中使用静态变量来计数。然后,就在网上一通查找,找的方法都是利用类的方法来实现静态变量。说实话没有看太懂,另外我想如果用类成员当做静态变量来计数是不是很麻烦,我们还要编写ADD()函数,来实现加1操作(因为要计数吗?)。其实,主要原因还是没有看懂如何用类成员的方式实现静态变量,因此,我放弃了这种方法。

    这篇文章中主要使用了三种方法来实现一个累加器。

    方法一、通过类的__init__和__call__方法

    class foo:

    def __init__(self, n=0):

    self.n = n

    def __call__(self, i):

    self.n += i

    return self.n

    a=foo()

    print a(1)

    print a(2)

    print a(3)

    print a(4)

    方法二、在函数中定义一个类

    def foo2 (n=0):

    class acc:

    def __init__ (self, s):

    self.s = s

    def inc (self, i):

    self.s += i

    return self.s

    return acc (n).inc

    a=foo2()

    print a(1)

    print a(2)

    print a(3)

    print a(4)

    方法三、使用堆上的匿名参数,我觉得这个方法挺简单,我也是使用这个方法实现的

    def foo3 (i, L=[]):

    if len(L)==0:

    L.append(0)

    L[0]+=i

    return L[0]

    print foo3(1)

    print foo3(2)

    print foo3(3)

    print foo3(4)

    在python官方的2.6环境下运行, 上述三段代码得到的结果都是

    1

    3

    6

    10

    在此,非常感谢文章作者的帮助与分享。

    我自己的代码:

    '''

    函数:Pic_Num()

    功能:统计文件夹中图片的数量

    输入参数:dir_path----保存图片的文件夹路径

    '''

    def Pic_Num(dir_path,count):

    parents = os.listdir(dir_path)

    for parent in parents:

    child = os.path.join(dir_path,parent)

    if os.path.isdir(child):

    Pic_Num(child,count)

    else:

    count[0] += 1

    return int(count[0])

    调用方式如下:

    a = Pic_Num('E:/practical_face/result/code/video/Output/txt',L=[0]) 注意此处的count实际上是一个list但是只有一个值

    展开全文
  • 为什么Python没有静态变量?有一个问题问如何在python中模拟静态变量。另外,在网上可以找到许多创建静态变量的解决方案。 (尽管我还没有看到我喜欢的一个。)为什么Python不支持方法中的静态变量? 这被认为是非...

    为什么Python没有静态变量?

    有一个问题问如何在python中模拟静态变量。

    另外,在网上可以找到许多创建静态变量的解决方案。 (尽管我还没有看到我喜欢的一个。)

    为什么Python不支持方法中的静态变量? 这被认为是非Python的,还是与Python的语法有关?

    编辑:

    我专门询问了为什么进行设计决策,但我没有提供任何代码示例,因为我想避免解释来模拟静态变量。

    Georg Schölly asked 2020-02-22T23:28:07Z

    9个解决方案

    77 votes

    忽略这一点的想法是,静态变量仅在以下两种情况下才有用:何时真正应该使用类以及何时真正应该使用生成器。

    如果要将状态信息附加到函数,则需要一个类。 也许是一个简单的类,但是仍然是一个类:

    def foo(bar):

    static my_bar # doesn't work

    if not my_bar:

    my_bar = bar

    do_stuff(my_bar)

    foo(bar)

    foo()

    # -- becomes ->

    class Foo(object):

    def __init__(self, bar):

    self.bar = bar

    def __call__(self):

    do_stuff(self.bar)

    foo = Foo(bar)

    foo()

    foo()

    如果您希望函数的行为在每次调用时都发生变化,则需要一个生成器:

    def foo(bar):

    static my_bar # doesn't work

    if not my_bar:

    my_bar = bar

    my_bar = my_bar * 3 % 5

    return my_bar

    foo(bar)

    foo()

    # -- becomes ->

    def foogen(bar):

    my_bar = bar

    while True:

    my_bar = my_bar * 3 % 5

    yield my_bar

    foo = foogen(bar)

    foo.next()

    foo.next()

    当然,静态变量对于那些不想处理小任务的大型结构的麻烦的快速脚本很有用。 但是在那儿,您实际上只需要global就可以了,这似乎有点麻烦,但是对于小的一次性脚本来说,这是可以的:

    def foo():

    global bar

    do_stuff(bar)

    foo()

    foo()

    Ben Blank answered 2020-02-22T23:28:34Z

    19 votes

    类的一种替代方法是函数属性:

    def foo(arg):

    if not hasattr(foo, 'cache'):

    foo.cache = get_data_dict()

    return foo.cache[arg]

    虽然一门课可能更干净,但我认为这种技术可能有用并且更好,比全局性更好。

    davidavr answered 2020-02-22T23:28:59Z

    8 votes

    在Python 3中,我将使用闭包:

    def makefoo():

    x = 0

    def foo():

    nonlocal x

    x += 1

    return x

    return foo

    foo = makefoo()

    print(foo())

    print(foo())

    Josh Lee answered 2020-02-22T23:29:19Z

    6 votes

    我认为局部静态变量的大多数用途是模拟生成器,即具有执行某个过程迭代的某些函数,返回结果,但保留后续调用的状态。 Python使用yield命令非常优雅地处理了这一问题,因此似乎并不需要太多静态变量。

    Il-Bhima answered 2020-02-22T23:29:39Z

    5 votes

    这是一种设计选择。

    我假设Guido认为您不经常需要它们,而您从未真正需要它们:您始终可以只使用一个全局变量,并告诉每个人将它们的油腻腻的东西放在您的变量中;-)

    Jonas Kölker answered 2020-02-22T23:30:04Z

    4 votes

    出于缓存或记忆的目的,装饰器可以用作一种优雅且通用的解决方案。

    Mr Fooz answered 2020-02-22T23:30:24Z

    0 votes

    答案与为什么没人使用静态方法(即使它们存在)几乎相同。 您有一个模块级名称空间,其作用与类相同。

    Jason Baker answered 2020-02-22T23:30:44Z

    0 votes

    一个不明智的选择:

    您还可以使用函数默认值的定义时间评估的副作用:

    def func(initial=0, my_static=[])

    if not my_static:

    my_static.append(initial)

    my_static[0] += 1

    return my_static[0]

    print func(0), func(0), func(0)

    它确实很丑陋,很容易被颠覆,但是有效。 imo,使用global比这更干净。

    Richard Levasseur answered 2020-02-22T23:31:13Z

    -1 votes

    根据您的评论之一:“我想使用它们来缓存从磁盘加载的内容。如果可以将它们分配给函数,我认为它会使实例混乱的程度减少了”

    然后,将缓存类用作其他类的类或实例属性。 这样,您可以使用完整的类功能集,而不会造成其他问题。 此外,您还将获得可重复使用的工具。

    这表明,在SO上始终可以陈述一个人的问题,而不是要求一个特定的低级解决方案(例如缺少语言功能)。 这样一来,不必再有关于模拟“静态”(在我看来,这是古老语言中已弃用的功能)的无休止的辩论,而是可以早日给您一个很好的答案。

    Ber answered 2020-02-22T23:31:43Z

    展开全文
  • 这才知道python中也有自己的全局静态变量。实例的属性是实例的,如上class中的member1,对它进行+/-操作时,只会对一个相应对象实例产生影响,(其类和该类的其它实例的不受影响)。如果类的属性是...

    前段时间在论坛里面有人提问说,

    class foo():

    member1

    member2

    ...

    self.member1

    foo.member2

    其中的两个成员member1, member2有什么区别。。。这才知道python中也有自己的全局静态变量。

    实例的属性是实例的,如上class中的member1,对它进行+/-操作时,只会对一个相应对象实例产生影响,(其类和该类的其它实例的不受影响)。

    如果类的属性是 mutable 对象的话,对此对象*本身*的修改会反映到其他所有实例。python 中定义的静态成员变量,就是类的变量, 只能通过类.变量名的形式获取

    类变量是该类的所有对象共享的变量成员,

    class A:

    a1 = 0

    def __init__(self, a2):

    self.a2 = a2

    def setData(self, a3):

    self.a3 = a3

    def show(self):

    print 'A1:%s,a1:%s,a2:%s,a3:%s' %(A.a1, self.a1, self.a2, self.a3)

    if __name__ == '__main__':

    obj1 = A(1)

    obj2 = A(2)

    obj3 = A(3)

    obj1.setData(1)

    obj2.setData(2)

    obj3.setData(3)

    obj1.a1 = 1

    obj2.a1 = 2

    obj3.a1 = 3

    A.a1 = 1

    A.a2 = 2

    A.a3 = 3

    obj1.show()

    obj2.show()

    obj3.show()

    print 'A1:%s,A2:%s,A3:%s' %(A.a1, A.a2, A.a3)

    输出结果:A1:1,a1:1,a2:1,a3:1

    A1:1,a1:2,a2:2,a3:2

    A1:1,a1:3,a2:3,a3:3

    A1:1,A2:2,A3:3

    展开全文
  • 随机类定义:class ABC:x = 6先为ABC实例设置一些值,然后为静态变量设置:abc = ABC()abc.x = 2ABC.x = 5然后打印结果:print abc.xprint ABC.x哪些版画25现在,我真的不知道发生了什么,因为如果我在类定义x=6中...
  • 本文实例讲述了python类和函数中使用静态变量的方法。分享给大家供大家参考。具体分析如下:在python的类和函数(包括λ方法)中使用静态变量似乎是件不可能[Nothing is impossible]的事,但总有解决的办法,下面通过...
  • Python定义变量

    2021-07-27 23:38:56
    Python定义变量 1、什么是变量: 在Python中,变量的概念基本上和初中代数的方程变量是一致的。例如,对于方程式 y=x*x ,x就是变量。当x=2时,计算结果是4,当x=5时,计算结果是25。 2、合法的变量名: 只是在...
  • 前言虽然各种编程语言之间大部分语法存在共通的地方,但是在一些细节的处理上还是千差万别才接触Python不久(之前是学Java的),实在想... “静态”变量的声明这里的静态变量是借用Java中静态变量的概念(不知道Python...
  • Python定义变量的方法

    千次阅读 2021-07-01 20:10:55
    Python中,定义一个变量需要遵循一定的约束,否则,Python可能识别不出它是一个变量变量名由大小写英文字母、数字和下划线_组成 变量不能用数字开头 变量尽量不要和Python关键字重合(比如前面学习过的:and...
  • python实现静态变量

    2021-01-12 01:15:21
    利用它可以实现静态变量。1. 意料之外的静态变量在使用类变量的时候一定要小心,否则会得到意料之外的结果。看下面的代码:class Foo(object):count = 0f1 = Foo()f2 = Foo()f1.count = 1print(f1.count, f2.count)#...
  • 本文主要讲述了如何去定义一个Python变量变量的概念基本上和初中代数的方程变量是一致的,只是在计算机程序中,变量不仅可以是数字,还可以是任意数据类型。变量在程序中就是用一个变量名表示了,变量名必须是大小...
  • 变量不过是用于定义,存储和对输入数据执行操作的编程元素。Python变量类型有哪些?Python变量有四种不同类型,...一.Python变量声明像其他编程一样,Python语言不希望静态变量声明以及要处理的变量的类型。python能...
  • python如何定义一个全局变量

    千次阅读 2021-01-25 11:28:38
    和C语言一样,Python也具有全局变量,其定义全局变量的用法有两种: 声明法 该方法是直接在当前模块中进行全局变量定义声明,使用global的声明方式,再进行引用! OLD_URL='http://oldboyedu.com' def bb(): ...
  • Python静态方法和类成员方法都可以被类或实例访问,两者概念不容易理清,但还是有区别的:1)静态方法无需传入self参数,类成员方法需传入代表本类的cls参数;2)从第1条,静态方法是无法访问实例变量的,而类成员...
  • python static变量

    千次阅读 2021-01-13 05:02:52
    python在函数中有static变量python函数怎么实现static变量python函数实现static变量具体如下:def ask_ok(prompt, retries=4, complaint='Yes or no, please。'): while True: ok = raw_input(prompt) if ok in ...
  • 1、存储位置动态变量:存储在内存出栈数据区静态变量:存储在全局数据区(静态数据区)2、生命期动态变量:根据你定义的位置确定,比如你在一个函数中定义的,那么超出该函数范围变量将失效静态变量:程序结束时才释放...
  • 让编辑器知道有这一个变量的存在 定义变量:为不同数据类型的变量分配内存空间 初始化:赋值,填充分配好的内存空间 引用:通过引用对象(变量名)来调用内存对象(内存数据) 2.3作用域的产生 就作用域而言,Python与C...
  • 在Java中,我可以给一个类一个静态变量,这里是它的计数器.我在构造函数中递增它,这使得它的目的是跟踪从这个类中实例化了多少个对象class Thing{private static int counter;public Thing(){counter++;}public static...
  • 实例变量实例变量则是以为self...."def test(self):#在内部Test.a是不能访问类变量的print self.aA = Test()A.test()类变量(对象变量)类变量定义在类的定义之后,实例化前后都可以使用class Test(o...
  • 这很好,但值得注意的是,python在类和实例变量方面有很大的灵活性。方法也是如此。为了获得很好的可能性,我建议阅读Michael Fötsch' new-style classes introduction,特别是第2至6部分。在开始时需要记住很多...
  • 导读:Python中不明确区分赋值和应用,一般对静态变量的传递为赋值,对动态变量的传递为引用。(注,对静态变量首次传递时也是应用,当需要修改静态变量时,因为静态变量不能改变,所以需要生成一个新的空间存储数据)...
  • 分享给大家供大家参考,具体如下:类变量与成员变量在类中声明的变量我们称之为类变量[静态成员变量],在init()函数中声明的变量并且绑定在实例上的变量我们称之为成员变量。类变量直接可以通过类名来调用。1、若类...
  • 首先要注意的是Java没有类方法。...在第二件要注意的事情是,Java类定义被解析成一个单独的类定义和一个隐式静态构造函数。初始化类属性时,这使您能够在类主体中定义方法之前调用方法。这是因为在实...
  • python中实现静态方法和类方法都是依赖于python的修饰器来实现的。 对象方法有self参数,类方法有cls参数,静态方法是不需要这些附加参数的。1、我们已经讨论了类/对象可以拥有像函数一样的方法,这些对象方法与函数...
  • python3.7可能还有些小问题需要修正

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 82,236
精华内容 32,894
关键字:

python定义静态变量

python 订阅