/*
* CDummy.h
*/
#ifndef CDUMMY_H_
#define CDUMMY_H_
class CDummy {
public:
CDummy();
virtual ~CDummy();
};
#endif /* CDUMMY_H_ */
Run Code Online (Sandbox Code Playgroud)
我读过不应在头文件中声明类变量。这是对的吗?所以我在下面的cpp文件中声明它:
/*
* CDummy.cpp
*/
#include "CDummy.h"
static int counter = 0; //so here is my static counter. is this now private or public? how can i make it public, i cannot introduce a public block here.
CDummy::CDummy() {
counter++;
}
CDummy::~CDummy() {
counter--;
}
Run Code Online (Sandbox Code Playgroud)
使用此代码我无法从我的主程序访问类变量....
谢谢
在 Python 中使用类变量时,可以通过“self”(感谢引用)或“type(self)”(直接)访问和(如果它是可变的)直接操作它,而不可变变量(例如整数)显然得到当您只使用“self”时,会被新的实例对象遮蔽。
那么,在处理 Python 类变量时,总是使用“type(self)”来处理从类方法中引用的类变量是否更可取/Pythonic?
(我知道类变量有时不受欢迎,但是当我使用它们时,我想以一致的方式访问它们(如果它们是不可变类型,则采用一种方式,如果它们是可变的,则采用另一种方式。)
编辑:是的,如果你修改一个不可变的值,你会得到一个新对象。修改可变对象的值的副作用是导致这个问题的原因 - “self”会给你一个引用,你可以用它来改变类变量而不隐藏它,但是如果你给它分配一个新对象,它会隐藏它。使用 classname.classvar 或 type(self).classvar 或 self.__class__ 可确保您始终使用类变量,而不仅仅是隐藏它(尽管子类使这变得复杂,如下所述)。
我目前面临的问题是,我的所有对象都使用具有“相同”初始值的实例变量,而我只读了这个。
def initialize
@available_ids = read_only_value
end
Run Code Online (Sandbox Code Playgroud)
但棘手的事情来了:这个“read_only_value”是从 API 检索的。为了简单起见,我们假设该值是一个整数数组,并且每月更改一次。
但我不想通过每次创建对象时检索值来拒绝 API。如果我改用类变量怎么办?
class Foo
@@available_ids = read_only_value
def initialize
@available_ids = @@available_ids //weird but let's go with it
end
end
Run Code Online (Sandbox Code Playgroud)
我认为这将解决 API 垃圾邮件的问题,因为它仅在变量初始化后执行...
但这种情况什么时候发生呢?当我启动 Rails 应用程序时,当我创建第一个对象时?它会更新吗?由于该值每月更改一次,我如何获取更新?
PS:我想最好的选择是将 ids 保存在数据库中,并偶尔或按需检查 ids。
我有一个包含字段的 Python 类state。为了定义所有可能的状态,我声明了一个嵌套枚举:
class Foo:
class State(enum.Enum):
Unloaded = enum.auto()
Loaded = enum.auto()
Processed = enum.auto()
state: State
Run Code Online (Sandbox Code Playgroud)
不过这样写代码有点麻烦:
if foo.state == Foo.State.Unloaded:
do_something_with(foo)
foo.state = Foo.State.Loaded
Run Code Online (Sandbox Code Playgroud)
我想让枚举成员作为Foo(如Foo.Unloaded、Foo.Loaded和Foo.Processed)的成员直接访问。有没有比手动分配更好的方法?
class Foo:
class State(enum.Enum):
Unloaded = enum.auto()
Loaded = enum.auto()
Processed = enum.auto()
Unloaded = State.Unloaded
Loaded = State.Loaded
Processed = State.Processed
state: State
Run Code Online (Sandbox Code Playgroud) 如果我有一个类(如下所示)并且在函数中我设置了一个变量(下面:$ this-> example)但是我还没有在类的顶部声明变量(例如var $ example;)我在哪里以及如何用这个变量?我尝试在另一个函数中直接使用它但它没有用(我想我可能犯了一个错误,但它在我在类的顶部声明它之后起作用了)
我在Symfony中已经看到了这个用于设置你可以在视图中使用的变量的内容,而且我在Phorms中也提到了它,并列举了几个例子.
很抱歉,如果这很明显,我只想了解如何使用这些变量,包括获取变量的名称(例如$ this-> example,by name我的意思是"example").
class ExampleClass{
var $another_var;
function __construct($data){
$this->example = $data;
$this->another_var = $data;
}
function exampleFunction(){
$test = $this->example; //this doesnt work
$another_test = $this->another_var; //this obviously does
}
}
Run Code Online (Sandbox Code Playgroud)
任何帮助将非常感激
问候
卢克
编辑:( 从我对DrColossus的回复)
我希望能够在函数中设置任何变量名,并在另一个函数中获取任何使用name设置的变量.例如在Symfony中我可以在动作类函数中设置$ this-> completly_random_name = $ x,然后在视图中我可以使用$ completly_random_name.symfony无法在父类的顶部设置变量名的所有可能组合.
我认为可以在这样的特征类中定义attr_accessor方法:
class IOS
@@modules_paths = "hello"
class << self
attr_accessor :modules_paths
end
end
puts IOS::modules_paths
Run Code Online (Sandbox Code Playgroud)
但这没有任何回报.
有办法吗?
这是我定义的泛型类,我想知道的是当我使用类变量创建更具体的类(例如CAR类)时?我个人对类变量的理解是,在类中声明的类变量的单个副本将使用关键字static声明,并且已从类中实例化的每个对象将包含该类的单个副本变量.
实例变量允许从类创建的类/对象的每个实例每个对象都有一个实例变量的单独副本?
因此,实例变量对于定义类/数据类型的属性很有用,例如House会有一个位置,但现在我何时在House对象中使用类变量?或者换句话说,在设计类时正确使用类对象是什么?
public class InstanceVaribale {
public int id; //Instance Variable: each object of this class will have a seperate copy of this variable that will exist during the life cycle of the object.
static int count = 0; //Class Variable: each object of this class will contain a single copy of this variable which has the same value unless mutated during the lifecycle of the objects.
InstanceVaribale() {
count++;
}
public static void main(String[] args) {
InstanceVaribale A …Run Code Online (Sandbox Code Playgroud) 我在Django中有一个调用外部库/类的视图.问题是由于某些原因,Django保持缓存来自该类之前调用的结果.
请考虑以下简单示例:
Django视图:
from some_path import Demo
def test_view(request):
demo = Demo()
result = demo.do_something()
return render(request, 'test.html',
{ 'result':result }
)
Run Code Online (Sandbox Code Playgroud)
演示课:
class Demo():
result = []
def do_something(self):
self.result.append(1)
self.result.append(2)
self.result.append(3)
return self.result
Run Code Online (Sandbox Code Playgroud)
你期望结果是[1,2,3],对吗?错误!
第一次加载页面时,您将获得正确的结果.但是在以下所有请求中它将继续递增:[1,2,3,1,2,3] ...... [1,2,3,1,2,3,1,2,3] ......
所以我的问题很明显 - 这里发生了什么?每次我在Django视图中调用一个类时,我如何收到[1,2,3]?
Django 1.7/MacOS X.
我有一段使用类变量的代码.我已经读过Ruby中通常应该避免使用类变量.
类变量是@@cost和@@kwh.
如何在不使用类变量的情况下重写以下内容?
class Device
attr_accessor :name, :watt
@@cost = 0.0946
def initialize(name, watt)
@name = name
@watt = watt
end
def watt_to_kwh(hours)
@@kwh = (watt / 1000) * hours
end
def cost_of_energy
puts "How many hours do you use the #{self.name} daily?"
hours = gets.chomp.to_i
self.watt_to_kwh(hours)
daily_cost = @@kwh * @@cost
montly_cost = daily_cost * 30
puts "Dayly cost: #{daily_cost}€"
puts "montly_cost: #{montly_cost}€"
end
end
Run Code Online (Sandbox Code Playgroud) 在下面的示例中,Test类有两个实例方法和一个classmethod
在set_cls_var_1方法中,我使用self设置类变量.
在set_cls_var_2方法中,我使用self调用类方法.
class Test():
#class variable
cls_var = 10
def __init__(self):
obj_var=20
def set_cls_var_1(self,val):
#second method to access class variable
print "first "
self.cls_var = val
def set_cls_var_2(self):
print "second"
self.task(200)
@classmethod
def task(cls,val):
cls.cls_var = val
t=Test()
#set class variable by first method
t.set_cls_var_1(100)
print Test.cls_var
#set class variable by second method
t.set_cls_var_2()
print Test.cls_var
Run Code Online (Sandbox Code Playgroud)
产量
first
10
second
200
Run Code Online (Sandbox Code Playgroud)
预期产出
first
100
second
200
Run Code Online (Sandbox Code Playgroud)
我的问题是:为什么只有classmethod可以自己调用,为什么不是类变量
class-variables ×10
python ×4
ruby ×3
class ×2
c++ ×1
class-method ×1
django ×1
enums ×1
header ×1
java ×1
oop ×1
php ×1
python-2.7 ×1