我正在实现一个几乎与集合相同的对象,但需要一个额外的实例变量,所以我是内置集合对象的子类.在复制其中一个对象时,确保复制此变量的值的最佳方法是什么?
使用旧的set模块,以下代码完美地运行:
import sets
class Fooset(sets.Set):
def __init__(self, s = []):
sets.Set.__init__(self, s)
if isinstance(s, Fooset):
self.foo = s.foo
else:
self.foo = 'default'
f = Fooset([1,2,4])
f.foo = 'bar'
assert( (f | f).foo == 'bar')
Run Code Online (Sandbox Code Playgroud)
但是使用内置的设置模块不起作用.
我能看到的唯一解决方案是覆盖返回复制的set对象的每个方法...在这种情况下,我可能不会打扰子类化set对象.当然有一种标准的方法可以做到这一点?
(为了澄清,下面的代码并不能正常工作(断言失败):
class Fooset(set):
def __init__(self, s = []):
set.__init__(self, s)
if isinstance(s, Fooset):
self.foo = s.foo
else:
self.foo = 'default'
f = Fooset([1,2,4])
f.foo = 'bar'
assert( (f | f).foo == 'bar')
Run Code Online (Sandbox Code Playgroud)
)
请原谅newbiew的总问题,但为什么@game_score总是为零呢?
#bowling.rb
class Bowling
@game_score = 0
def hit(pins)
@game_score = @game_score + pins
end
def score
@game_score
end
end
Run Code Online (Sandbox Code Playgroud) 在Ruby 1.8.7和1.9.2中也是如此:
$ irb
ruby-1.8.7-p302 > foo.nil?
NameError: undefined local variable or method `foo' for #<Object:0x3794c>
from (irb):1
ruby-1.8.7-p302 > @bar.nil?
=> true
ruby-1.8.7-p302 > @@wah.nil?
NameError: uninitialized class variable @@wah in Object
from (irb):3
Run Code Online (Sandbox Code Playgroud)
为什么实例变量的处理方式与本地和类变量不同?
在Apple的Objective-C编程中,关于封装数据的部分指出:
您可以定义没有属性的实例变量
最好在需要跟踪值或其他对象时在对象上使用属性.
换句话说,他们强烈建议您使用私有属性而不是实例变量用于任何私有对象状态.
我想知道为什么会这样呢?我知道属性具有KVO和属性(强,弱......)等功能,但在很多情况下我不需要这些功能,实例变量也可以正常工作.
实例变量可能不被视为最佳实践有什么好的理由吗?
我很好奇,无论如何,在init方法中调用一个方法来设置类的实例属性.基本上我只有一个子类UIView的类,在init中添加一些子视图,其中一些子视图是类的实例变量.
class MyView: UIView {
var collectionView: UICollectionView
convenience init () {
self.init(frame:CGRectZero)
}
override init (frame : CGRect) {
super.init(frame : frame)
addSubviews()
}
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
addSubviews()
}
func addSubviews (){
self.collectionView = UICollectionView()
}
}
Run Code Online (Sandbox Code Playgroud)
现在问题是我在初始化类内部属性之前不能调用super init(属性'self.collectionView'在super.init调用时没有被初始化),但是我也无法调用我的自定义方法来初始化那些变量super.init,因为它不能在初始化之前使用self.我意识到我可以使实例变量可选,但它似乎不太优雅,因为我知道它将始终被初始化(还有更多,这只是一个简化版本).有没有办法在不制作所有实例变量选项的情况下完成此操作?
编辑:
我想最终我的问题是为什么swift dis-allow在调用super.init之前调用一个方法?有什么区别:
override init (frame : CGRect) {
addSubviews()
super.init(frame : frame)
}
final func addSubviews (){
self.collectionView = UICollectionView()
}
Run Code Online (Sandbox Code Playgroud)
和
override init (frame : CGRect) {
self.collectionView = UICollectionView()
super.init(frame : frame)
}
Run Code Online (Sandbox Code Playgroud) 我有一个rails控制器,定义了两个动作:index和show.我在index操作中定义了一个实例变量.代码如下所示:
def index
@some_instance_variable = foo
end
def show
# some code
end
Run Code Online (Sandbox Code Playgroud)
我如何可以访问@some_instance_variable的show.html.erb模板?
可能重复:
类如何拥有自己类型的成员,这不是无限递归吗?
代码:
public class Test2{
private Test2 subject = new Test2(); //Create Test2 object in Test2
private int num;
}
Run Code Online (Sandbox Code Playgroud)
问题:
为什么Java允许执行上面的代码,但C++不允许?
上面的代码是否创建了无限数量的对象?由于Test2它本身包含一个Test2对象,该对象又包含一个Test2本身具有Test2对象的对象等.
在标题中声明私有实例变量与在实现中声明它之间有什么区别吗?
在TestObj.h中
@interface TestObj : NSObject
{
int test;
}
@end
Run Code Online (Sandbox Code Playgroud)
在TestObj.m中的vs
@interface TestObj()
{
int test;
}
@end
Run Code Online (Sandbox Code Playgroud)
两者似乎都等同于我,在标题和实现中声明实例变量之间是否存在任何实际差异,如果不是首选?在@interface实现文件中似乎只是一个方法来声明私有属性,它有之外的任何其他目的?
我提前道歉,基于范围可能是一个相当简单/快速的答案,但我到处都看,并且很惊讶没有得到答案.
我创建了一个名为Soldier的类,它有大约100个类变量.我需要一个用户输入信息,然后在几个不同的类窗体的过程中逐渐构建一个Solider对象(因为只有一个数据需要收集的数据太多).
我在Form1.cs中创建一个Soldier(tempSoldier)的(空)实例,并开始设置我从用户收集的对象的类变量.
private void button1_Click(object sender, EventArgs e)
{
Soldier tempSoldier = new Soldier();
tempSoldier.surname = textbox1.text;
}
Run Code Online (Sandbox Code Playgroud)
我的问题:如何从其他类(Form2.cs,Form3.cs ...)中的Form1.cs访问对象实例(tempSoldier)?
我应该提到所有表单(Form1.cs,Form2.cs ...)共享相同的名称空间.
提前致谢
编辑:以下所有解决方案都可以工作,这取决于您最喜欢哪一个.感谢您的反馈意见.一个小注意事项,请确保将所有类修饰符设置为Public包括您的自定义类(在我的例子中为Soldier.cs).
有没有办法在python中为类声明抽象实例变量?
例如,我们有一个抽象基类,Bird带有fly使用abc包实现的抽象方法,以及feathers作为属性实现的抽象实例变量(我正在寻找的)。
from abc import ABCMeta, abstractmethod
class Bird(metaclass=ABCMeta):
@property
@abstractmethod
def feathers(self):
"""The bird's feathers."""
@abstractmethod
def fly(self):
"""Take flight."""
Run Code Online (Sandbox Code Playgroud)
问题是,Eagle从 派生的类Bird需要feathers实现为属性方法。所以以下不是一个可以接受的类,但我希望它是
class Eagle(Bird):
def __init__(self):
self.feathers = 'quill'
def fly(self):
print('boy are my arms tired')
Run Code Online (Sandbox Code Playgroud)
可能存在问题,因为需求是在实例本身上,并且确实在实例化之后,所以我不知道像abc包这样的东西是否仍然有效。
有没有一些标准的方法来处理这个问题?