我有以下代码段:
class A:
def __init__(self):
self.state = 'CHAT'
def method1(self):
self.state = 'SEND'
def printer(self):
print self.state
class B(A):
def method2(self):
self.method1()
print self.state
ob_B = B()
ob_A = A()
ob_B.method2()
ob_A.printer()
Run Code Online (Sandbox Code Playgroud)
这给了我输出:
SEND
CHAT
Run Code Online (Sandbox Code Playgroud)
我想要它打印:
SEND
SEND
Run Code Online (Sandbox Code Playgroud)
也就是说,当通过调用 self.method1 修改 self.state 时,我希望它修改A 实例中B.method2已经存在的值。self.state = 'CHAT'我怎样才能做到这一点?
我有点恼火为什么会这样:
cattr_accessor :aggregate { true }
Run Code Online (Sandbox Code Playgroud)
失败并出现错误:
syntax error, unexpected '{', expecting keyword_end
cattr_accessor :aggregate { true }
^
Run Code Online (Sandbox Code Playgroud)
虽然完全相同,但 do/end 似乎在做正确的事情:
cattr_accessor :aggregate do true end
Run Code Online (Sandbox Code Playgroud)
(但是太冗长了;)
来源:http : //api.rubyonrails.org/classes/Class.html#method-i-cattr_writer 考虑到我必须花在这个上的时间,它有点过于粗糙。想法?
Python 3.4.0a1
视窗 8.1
创建的类:
class Bank(object):
bankrupt = False
Run Code Online (Sandbox Code Playgroud)
命令在 IDLE 中输入,__main__结果如下:
>>> a = Bank()
>>> b = Bank()
>>> a.bankrupt
False
>>> b.bankrupt
False
>>> b.bankrupt = True
>>> b.bankrupt
True
>>> a.bankrupt
False
Run Code Online (Sandbox Code Playgroud)
当我更改 b.bankrupt 时,我预计 a.bankrupt 会更改为 True,因为变量 bankrupt 是为整个类定义的,而不是为单个实例定义的(带有self.bankrupt) 为什么这没有发生?
例子:
class Base
@@var = "base"
def self.assign_var(var)
@@var = var
end
def self.show_var
@@var
end
def initialize
p @@var
end
end
class A < Base
assign_var("a")
end
class B < Base
assign_var("b")
end
class C < Base
assign_var("c")
end
p A.show_var # "c"
p B.show_var # "c"
p C.show_var # "c"
a = A.new # "c"
b = B.new # "c"
c = C.new # "c"
Run Code Online (Sandbox Code Playgroud)
如何让他们表现出自己在班级中分配的价值?像这样:
p A.show_var # "a"
p B.show_var # "b"
p C.show_var # "c" …Run Code Online (Sandbox Code Playgroud) 我是否为这种作业创建了额外的方法?@@variable = @global_variable为什么?我希望有一些变量可以通过我的脚本访问值和定义,并且只有一个定义位置.
@global_variable = 'test'
class Test
@@variable = @global_variable
def self.display
puts @@variable
end
end
Test.display #gives nil
Run Code Online (Sandbox Code Playgroud) 我不想从外部(通过attr_accessor)设置类的类变量,然后从其中一个对象内部访问它.我正在使用ruby 1.9.2.这是我的代码:
class Service
def initialize(id)
@my_id = id
end
class << self
attr_accessor :shared_id
end
def system_id
@my_id + @@shared_id
end
end
Run Code Online (Sandbox Code Playgroud)
如果我设置Service.shared_id = "A2",然后调用Service.new("A").system_id,这不会返回"AA2".它显示以下错误:
服务中未初始化的类变量@@ shared_id
如果我没有设置Service.service_id,则行为就像.有人可以解释为什么会这样吗?
(我不知道我是否应该在这里问这个)我想运行两次相同的java程序,其中大部分变量都是静态的.
如果我运行这两次(同时)这些静态变量将具有相同的值或不同?
由于静态变量是类变量,这让我感到困惑.
我在本教程中遇到了以下示例:
class Song
@@plays = 0
def initialize(name, artist, duration)
@name = name
@artist = artist
@duration = duration
@plays = 0
end
def play
@plays += 1
@@plays += 1
"This song: #@plays plays. Total #@@plays plays."
end
end
s1 = Song.new("Song1", "Artist1", 234) # test songs
s2 = Song.new("Song2", "Artist2", 345)
puts s1.play
puts s2.play
puts s1.play
puts s1.play
Run Code Online (Sandbox Code Playgroud)
@@只能在Song课程中礼貌地播放吗?这篇评论提出了不建议使用类变量的观点.是不是b/c它们在日常使用中通常不需要,并且在使用时会产生很多调试问题?
我刚刚开始设计一个Perl类,而我很久以前使用OOP的唯一体验就是使用C++.
我需要将一些数据项作为"类变量" - 由所有实例共享.我希望在我第一次实例化一个对象之前对它们进行初始化,并且我希望主程序use MyClass能够为该初始化过程提供参数.
这是一个带有类变量的类的工作示例:
package MyClass;
use strict;
use warnings;
# class variable ('our' for package visibility)
#
our $class_variable = 3; # Would like to bind to a variable
sub new {
my $class = shift;
my $self = { };
bless $self, $class;
return $self;
}
sub method {
my $self = shift;
print "class_variable: $class_variable\n";
++$class_variable; # prove that other instances will see this change
}
Run Code Online (Sandbox Code Playgroud)
这是一个演示:
#!/usr/bin/perl
use strict;
use warnings;
use …Run Code Online (Sandbox Code Playgroud) 我有我的伪接口,我实现了几次.每个实现都应该存储一个基本上定义文件路径(模板)的变量.因为这些类是由工厂生成的,所以我不知道会出现哪个子类,因此,我想通过实例方法访问类变量.
这并不会造成问题,但是,当我从我的Interface继承时,我不想getHidden()多次实现该方法(在下面).但是把它称之为它所记录的方式,总会隐藏起来.
class MySuperInterface(object):
# class Variable
__much = "hidden"
# instance method
def getHidden(self):
print self.__class__.__much
class MySub(MySuperInterface):
__much = "this is different per subclass!"
def soTroublesome(self):
print self.__class__.__much
Run Code Online (Sandbox Code Playgroud)
执行
>>> sub = MySub() # I don't know this class!
>>> sub.getHidden()
hidden
>>> sub.soTroublesome()
this is different per subclass!
Run Code Online (Sandbox Code Playgroud)
那么,我如何实现getHidden()访问实例的类'classvariable.我知道,我检查过的信息是可用的dir(),但我不知道如何访问它.同样,我不想最终得到一个类/静态方法,因为我不知道从我的工厂出来的类!
谢谢!
class-variables ×10
ruby ×4
python ×3
scope ×2
class ×1
class-design ×1
inheritance ×1
java ×1
oop ×1
perl ×1
python-3.x ×1
static ×1
variables ×1