标签: class-variables

动态创建静态变量(Enum hack)

我正在尝试为一个Node类创建一组状态。通常,我会通过将每个Node实例的state变量设置为int, 并记录哪个 int 对应于哪个状态来完成此操作(因为我没有enums)。
这次,我想尝试一些不同的东西,所以我决定这样做:

class Node:
  state1 = 1
  state2 = 2

  def __init__(self):
    ...
Run Code Online (Sandbox Code Playgroud)

这效果很好。然而,我遇到了一个问题,我有很多状态 - 太多而无法手动输入。此外,对于这么多状态,我可能会犯错误并将其分配int给两个状态。在测试状态时,这将是错误的来源(例如:如果和都是 ,if self.state==Node.state1则可能会失败)。Node.state1Node.state23

为此,我想做这样的事情:

class Node:
  def __init__(self):
    ...
...

for i,state in enumerate("state1 state2".split()):
  setattr(Node, state, i)
Run Code Online (Sandbox Code Playgroud)

虽然这可以修复为状态赋值时的人为错误,但它非常丑陋,因为类变量是在类定义之外设置的。

有没有一种方法可以以这种方式在类定义中设置类变量?我理想地想这样做:

class Node:
  for i,state in enumerate("state1 state2".split()):
    setattr(Node, state, i)
Run Code Online (Sandbox Code Playgroud)

...但这不会起作用,因为Node尚未定义,并且会导致NameError

或者,enumpython3.3中是否存在s?

我正在使用Python3.3.2,如果有的话

python enums class-variables python-3.x python-3.3

5
推荐指数
1
解决办法
3325
查看次数

为什么 Class 变量没有更新其所有实例?

我正在学习课程,但不明白这一点:

class MyClass:
    var = 1

one = MyClass()
two = MyClass()

print(one.var, two.var) # out: 1 1
one.var = 2

print(one.var, two.var) # out: 2 1
Run Code Online (Sandbox Code Playgroud)

我认为类变量可以被所有实例访问,为什么类变量不更新其所有实例?

python oop instance class-variables

5
推荐指数
1
解决办法
2256
查看次数

为什么在使用多处理时没有保留我的类属性?

我在 FastAPI 应用程序中有以下类:

import asyncio
import logging
from multiprocessing import Lock, Process

from .production_status import Job as ProductionStatusJob


class JobScheduler:
    loop = None
    logger = logging.getLogger("job_scheduler")
    process_lock = Lock()
    JOBS = [ProductionStatusJob]

    @classmethod
    def start(cls) -> None:
        cls.logger.info("Starting Up (1/2)")
        Process(target=cls._loop).start()
    
    @classmethod
    def _loop(cls) -> None:
        cls.loop = asyncio.get_event_loop()
        cls.loop.create_task(cls._run())
        cls.logger.info("Startup Complete (2/2)")
        cls.loop.run_forever()
        cls.loop.close()

    @classmethod
    async def _run(cls) -> None:
        while True:
            ...

    @classmethod
    async def stop(cls) -> None:
        cls.logger.info("Shutting Down (1/2)")
        with cls.process_lock:
            cls.loop.stop()                          # <= This Line …
Run Code Online (Sandbox Code Playgroud)

python event-loop multiprocessing class-variables fastapi

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

Python中Ruby的类@@变量的等价物是什么?

在Ruby 1.9中,我可以使用它的类变量,如下所示:

class Sample
  @@count = 0

  def initialize
    @@count += 1
  end

  def count
    @@count
  end
end

sample = Sample.new
puts sample.count     # Output: 1

sample2 = Sample.new
puts sample2.count    # Output: 2
Run Code Online (Sandbox Code Playgroud)

如何在Python 2.5+中实现上述功能?

ruby python class-variables

4
推荐指数
1
解决办法
351
查看次数

Python类变量问题

我对python的类变量有些怀疑.据我所知,如果我定义一个在__init__()函数外声明的类变量,这个变量在C++中只会创建一次作为静态变量.

这似乎适用于某些python类型,例如dict和list类型,但对于那些基类型,例如int,float,则不一样.

例如:

class A:
    dict1={}
    list1=list()
    int1=3

    def add_stuff(self, k, v):
        self.dict1[k]=v
        self.list1.append(k)
        self.int1=k

    def print_stuff(self):
        print self.dict1,self.list1,self.int1

a1 = A()
a1.add_stuff(1, 2)
a1.print_stuff()
a2=A()
a2.print_stuff()
Run Code Online (Sandbox Code Playgroud)

输出是:

{1: 2} [1] 1
{1: 2} [1] 3
Run Code Online (Sandbox Code Playgroud)

我理解dict1和list1的结果,但为什么int1行为不同?

python class-variables

4
推荐指数
1
解决办法
419
查看次数

Python OOP和列表

我是Python的新手,它是OOP的东西,无法让它工作.这是我的代码:

class Tree:

    root = None;
    data = [];

    def __init__(self, equation):
        self.root = equation;

    def appendLeft(self, data):
        self.data.insert(0, data);

    def appendRight(self, data):
        self.data.append(data);

    def calculateLeft(self):
        result = [];
        for item in (self.getLeft()):
            if (type(item) == type(self)):
                data = item.calculateLeft();
            else:
                data = item;
            result.append(item);
        return result;

    def getLeft(self):
        return self.data;

    def getRight(self):
        data = self.data;
        data.reverse();
        return data;

tree2 = Tree("*");
tree2.appendRight(44);
tree2.appendLeft(20);

tree = Tree("+");
tree.appendRight(4);
tree.appendLeft(10);
tree.appendLeft(tree2);

print(tree.calculateLeft());
Run Code Online (Sandbox Code Playgroud)

看起来树2和树正在共享列表"数据"?

目前我希望输出像[[20,44],10,4]这样的东西,但是当我

tree.appendLeft(tree2) 
Run Code Online (Sandbox Code Playgroud)

我得到了RuntimeError: maximum recursion depth exceeded …

python class-variables

4
推荐指数
1
解决办法
589
查看次数

为每个子类提供自己的类变量副本

我的iOS应用程序中有以下类(它类似于Java世界中的抽象类).

@implementation WSObject

static NSDictionary* _dictionary = nil;
+(NSDictionary*) dictionary {
    if (_dictionary == nil) {
        _dictionary = [NSKeyedUnarchiver unarchiveObjectWithFile:[self localStorePath]];
    }
    return _dictionary;
}

...

@end
Run Code Online (Sandbox Code Playgroud)

然后,我有多个类,WSObject使用类方法实现上述dictionary.问题是,这些类中的每一个都应该有自己的类_dictionary,但它们都是从超类共享同一个对象.当然,我可以复制到所有子类,但这会破坏可重用性.除了这个getter之外,还有其他类方法WSObject可以改变字典.因此,每个子类中都应该有几个类方法.

我怎样才能以聪明的方式解决这个问题?如果我的描述不充分,请告诉我.

inheritance objective-c class-variables subclassing

4
推荐指数
2
解决办法
1078
查看次数

ruby中的类可以使用@class_instance_variable而不是@@ class_variable存储实例化对象的数量吗?

我试图在定义这些对象的类中保持给定类的对象实例的计数.

首先我知道代码反射和ObjectSpace.each_object,但我不想使用反射,让类本身能够"照顾"自己.

我环顾四周,我发现的所有解决方案似乎都在类定义中使用了@@ class_variables,例如,这个问题的接受答案:如何在Ruby中获取类实例?

虽然我一直在阅读,但我发现ruby中的类变量在某些情况下表现得非常糟糕......最大的原因是:

在程序顶层定义的类变量由所有类继承.它的行为类似于全局变量.

来源及更多信息:http://ruby.runpaint.org/variables#class

所以,我尝试使用类实例变量而不是类变量来编写一个存储其实例化对象数量的类,显然它似乎工作正常但是因为我仍然在学习这种"深入的"语言主题我想问你我写的代码是否正确和/或有意义:

class Pizza
  @orders = 0
  def self.new
    @orders += 1
  end
  def self.total_orders
    @orders
  end
end

new_pizza = Pizza.new #=> 1
special_pizza = Pizza.new #=> 2
fav_pizza = Pizza.new #=> 3
Run Code Online (Sandbox Code Playgroud)

我的一个疑问是,重写Pizza.new方法我"删除"原始.new方法的一些重要功能?(原始的.new方法提供了什么?我如何使用反射"检查"方法代码?)我还做错了什么,或者我的方法完全错误,为什么?

谢谢

编辑:忘了添加这个重要的一点:

作为一种更好地约束事物范围的方法,我希望Pizza类能够只计算对象实例化时间,而不是在其@instance类变量上有一个setter方法,可以在代码中随时访问它(Pizza.count = 1000).这就是我试图覆盖"新"的原因.

我认为这是最棘手的部分让我问自己我的方法是在正确的方向,或者我是否应该停止对这些语言机制的反应如此之多,而是添加一些逻辑来让计数只在一个对象发生时发生一个Pizza类进入了ObjectSpace ..

我只是在寻找更优雅,更臃肿的方式来获得这种语言功能..

无论哪种情况,帮助将不胜感激..

再次感谢.

ruby counter instances class-variables class-instance-variables

4
推荐指数
1
解决办法
4213
查看次数

在UML中表示类变量和方法

许多编程语言允许您定义类/实例方法,并且属性也相同.例如Python,Smalltalk.我有这些概念.例如,对于变量,每个对象都有自己的变量副本.类变量只有一个与该类的所有实例共享的变量副本.

我的疑问是:如何在UML中表示类方法和类属性?我想通过静态表示它,就像在C++,Java和C#中一样,但它可以吗?UML中的"static"和"class"是一样的吗?

谢谢!

uml class-diagram class-method class-variables

4
推荐指数
1
解决办法
2792
查看次数

在类中观察静态var的值?

我有一门课,static var其中存储了当前的在线连接状态。我想ConnectionManager.online通过其他课程来观察价值。我想用KVO做到这一点,但是将static变量声明为dynamic会导致错误:

class ConnectionManager: NSObject {
    dynamic static var online = false
    // adding 'dynamic' declaration causes error:
    // "A declaration cannot be both 'final' and 'dynamic'
}
Run Code Online (Sandbox Code Playgroud)

最优雅的方法是什么?

更新。这是我的KVO部分代码:

override func viewDidLoad() {
    super.viewDidLoad()

    ConnectionManager.addObserver(
        self,
        forKeyPath: "online",
        options: NSKeyValueObservingOptions(),
        context: nil
    )
}

override func observeValueForKeyPath(keyPath: String?, 
                                     ofObject object: AnyObject?, 
                                     change: [String : AnyObject]?, 
                                     context: UnsafeMutablePointer<Void>) {
    if keyPath == "online" {
        print("online status changed to: \(ConnectionManager.online)") …
Run Code Online (Sandbox Code Playgroud)

cocoa-touch key-value-observing class-variables ios swift

4
推荐指数
2
解决办法
1835
查看次数