我很惊讶地发现子类的类变量无法访问父类的类变量而没有明确指出父类的类名:
>>> class A(object):
... x = 0
...
>>> class B(A):
... y = x+1
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in B
NameError: name 'x' is not defined
>>> class B(A):
... y = A.x + 1
...
>>> B.x
0
>>> B.y
1
Run Code Online (Sandbox Code Playgroud)
为什么在定义中我必须引用Ax而不仅仅是x?这与我对实例变量的直觉相反,因为我可以在定义B之后引用Bx.
子类是否继承,主类的朋友关联(主类'自己和其他类与主类相关)?
或者换句话说,继承如何应用于friend关键字?
扩展:如果没有,有没有办法继承友谊?
我遵循Jon的建议来提出设计问题:
C++类设计问题
关于子类化a的堆栈溢出问了几个问题UIButton,有几个人告诉我我不应该继承a UIButton.
子类化的负面因素是UIButton什么?而且我知道它含糊不清,但是继承子类的其他选择是UIButton什么?
我想在Python中实现一个自定义列表类作为子类list.list为了获得所有列表操作的完全类型兼容性,我需要从基类重写的最小方法集是什么?
这个问题表明至少__getslice__需要被覆盖.从进一步的研究,也__add__和__mul__是必需的.所以我有这个代码:
class CustomList(list):
def __getslice__(self,i,j):
return CustomList(list.__getslice__(self, i, j))
def __add__(self,other):
return CustomList(list.__add__(self,other))
def __mul__(self,other):
return CustomList(list.__mul__(self,other))
Run Code Online (Sandbox Code Playgroud)
即使没有重写方法,以下语句也可以按预期工作:
l = CustomList((1,2,3))
l.append(4)
l[0] = -1
l[0:2] = CustomList((10,11)) # type(l) is CustomList
Run Code Online (Sandbox Code Playgroud)
这些语句仅适用于上述类定义中的重写方法:
l3 = l + CustomList((4,5,6)) # type(l3) is CustomList
l4 = 3*l # type(l4) is CustomList
l5 = l[0:2] # type(l5) is CustomList
Run Code Online (Sandbox Code Playgroud)
我唯一不知道如何实现的是使扩展切片返回正确的类型:
l6 = l[0:2:2] # type(l6) is list
Run Code Online (Sandbox Code Playgroud)
为了获得CustomList类型,我需要添加到我的类定义中l6 …
假设我在Java类中有一个方法,并且我不希望该类的任何子类能够覆盖该方法.我能这样做吗?
这是一个双重问题,具有理论部分和实践部分:
子类化dict时:
class ImageDB(dict):
def __init__(self, directory):
dict.__init__(self) # Necessary??
...
Run Code Online (Sandbox Code Playgroud)
应该dict.__init__(self)被称为"安全"措施(例如,如果有一些重要的非平凡实施细节)?有一个风险,即与Python的未来版本的代码休息,如果dict.__init__()是不叫?我正在寻找做一件事或另一件事的根本原因,这里(实际上,呼叫dict.__init__()是安全的).
我的猜测是,当ImageDB.__init__(self, directory)调用时,self已经是一个新的空dict对象,因此无需调用dict.__init__(我确实希望dict为空,首先).它是否正确?
编辑:
以上基本问题背后更实际的问题如下.我在考虑继承dict,因为我会经常使用db [...]语法(而不是一直使用db.contents [...]); 对象的唯一数据(属性)确实是一个字典.我想向数据库添加一些方法(例如get_image_by_name(),或者get_image_by_code(),例如),并且只覆盖__init__(),因为图像数据库是由包含它的目录定义的.
总之,(实际)问题可能是:对于行为类似于字典的东西,什么是良好的实现,除了它的初始化是不同的(它只需要一个目录名),并且它有其他方法?
许多答案都提到了"工厂".所以我想这一切归结为:你是否继承dict,覆盖__init__()和添加方法,还是你写了一个返回dict的(工厂)函数,你要添加方法?我更倾向于选择第一个解决方案,因为工厂函数返回一个对象,其类型并不表示它有其他语义和方法,但你怎么看?
编辑2:
我从每个人的回答中得知,当新类"不是字典"时,将dict子类化并不是一个好主意,特别是当它的__init__方法不能采用与dict相同的参数时__init__(在"实际问题"中就是这种情况)以上).换句话说,如果我理解正确,那么共识似乎是:当您进行子类化时,所有方法(包括初始化)必须与基类方法具有相同的签名.这允许isinstance(subclass_instance,dict)保证subclass_instance.__init__()可以像dict.__init__()例如一样使用.
然后弹出另一个实际问题:除了初始化方法之外,应该如何实现类似dict的类?没有子类?这需要一些麻烦的样板代码,不是吗?
根据官方的一些话题,Objective-C中的一个类只应在其标题中公开公共方法和属性:
@interface MyClass : NSObject
@property (nonatomic, strong) MyPublicObject *publicObject;
- (void)publicMethod;
@end
Run Code Online (Sandbox Code Playgroud)
和私有方法/属性应保存在.m文件的类扩展中:
@interface MyClass()
@property (nonatomic, strong) MyPrivateObject *privateObject;
- (void) privateMethod;
@end
Run Code Online (Sandbox Code Playgroud)
并且我认为没有protected类型的私有但可以从子类访问.我想知道,除了公开宣布私有财产/方法之外,还有什么可以做到这一点吗?
inheritance visibility subclass objective-c declared-property
我真的很难理解外卡参数.我有几个问题.
?作为类型参数只能在方法中使用.例如:printAll(MyList<? extends Serializable>)我无法使用?类型参数定义类.
我理解上限?. printAll(MyList<? extends Serializable>)意思是:" 如果它有实现接口的对象,printAll将打印.MyListSerialzable "
我有一个问题super.printAll(MyList<? super MyClass>)意思是:" 如果它有对象或任何扩展的类(后代),printAll将打印.MyListMyClassMyClassMyClass "
在我出错的地方纠正我.
总之,只有T或E或K或V或N可以用作类型参数用于定义通用类.?只能用于方法
public void printAll(MyList<? super MyClass>){
// code code code
}
Run Code Online (Sandbox Code Playgroud)
根据Ivor Horton的书,MyList<? super MyClass>意味着MyList如果它具有MyClass它实现的对象或任何接口或类,我可以打印.也就是说,MyClass是一个下限 …
谁能告诉我何时使用类别以及何时在Objective-C中使用子类?还请告诉我它们的优点和缺点.
对Python进行子类化dict按预期工作:
>>> class DictSub(dict):
... def __init__(self):
... self[1] = 10
...
>>> DictSub()
{1: 10}
Run Code Online (Sandbox Code Playgroud)
但是,用a做同样的事情是collections.OrderedDict行不通的:
>>> import collections
>>> class OrdDictSub(collections.OrderedDict):
... def __init__(self):
... self[1] = 10
...
>>> OrdDictSub()
(…)
AttributeError: 'OrdDictSub' object has no attribute '_OrderedDict__root'
Run Code Online (Sandbox Code Playgroud)
因此,OrderedDict实现使用私有__root属性,这可以防止子类OrdDictSub的行为类似于DictSub子类.为什么?如何从OrderedDict继承?
subclass ×10
python ×4
inheritance ×3
objective-c ×3
java ×2
c++ ×1
class ×1
dictionary ×1
friend ×1
generics ×1
init ×1
ios ×1
list ×1
methods ×1
superclass ×1
uibutton ×1
uikit ×1
visibility ×1