class child
{
child()
{
super();
System.out.println("Hello");
}
public static void main(String arg[])
{
child obj=new child();
}
}
Run Code Online (Sandbox Code Playgroud)
在此代码中,当我创建 child 类的对象时,将调用子构造函数。但为什么它没有给出错误,因为没有父类。super()在这里做什么?super() 关键字调用了谁的构造函数?
默认情况下,插槽是可写的:
>>> class A: __slots__ = ('x',)
...
>>> list(vars(A))
['__module__', '__slots__', 'x', '__doc__']
>>> vars(A)['x']
<member 'x' of 'A' objects>
>>> a = A()
>>> a.x = 'foo'
>>> del a.x
Run Code Online (Sandbox Code Playgroud)
如何创建只读插槽,像插槽'__thisclass__','__self__'和'__self_class__'之类的super?
>>> list(vars(super))
['__repr__', '__getattribute__', '__get__', '__init__', '__new__',
'__thisclass__', '__self__', '__self_class__', '__doc__']
>>> vars(super)['__thisclass__']
<member '__thisclass__' of 'super' objects>
>>> s = super(int, 123)
>>> s.__thisclass__ = float
Traceback (most recent call last):
File "<stdin>", line …Run Code Online (Sandbox Code Playgroud) 我似乎在继承类调用显式超类构造函数时遇到了非常令人沮丧的时间.我似乎无法正确使用语法!
到目前为止,我在这个问题上看到的所有例子都没有将头部和内联类定义(使用{}')与带头文件的前向声明分开,所以我不知道如何覆盖.h和.cc文件之间的语法.任何帮助,将不胜感激!
这是编译器给我的错误(gcc):
serverconnection.h:在构造函数"ServerConnection :: ServerConnection(std :: string,std :: string)"中:serverconnection.h:25:错误:输入serverconnection.cc末尾的预期`{':全局范围:serverconnection. cc:20:错误:重新定义"ServerConnection :: ServerConnection(std :: string,unsigned int,short unsigned int,PacketSender*,int)"serverconnection.h:25:error:"ServerConnection :: ServerConnection(std :: string) ,unsigned int,short unsigned int,PacketSender*,int)"之前在这里定义的serverconnection.cc:在构造函数中"ServerConnection :: ServerConnection(std :: string,std :: string)":serverconnection.cc:20:错误:否调用"Connection :: Connection()"的匹配函数
我知道它正在尝试调用默认的Connection构造函数Connection(),因为它只是不理解我的语法.
这是代码:
connection.h:
class Connection {
public:
Connection(string myOwnArg);
};
Run Code Online (Sandbox Code Playgroud)
connection.cc:
#include "connection.h"
Connection::Connection(string myOwnArg) {
//do my constructor stuff
}
Run Code Online (Sandbox Code Playgroud)
serverconnection.h:
#include "connection.h"
class ServerConnection : public Connection {
public:
ServerConnection(string myOwnArg, string superClassArg) : Connection(superClassArg);
};
Run Code Online (Sandbox Code Playgroud)
serverconnection.cc:
#include "serverconnection.h"
#include "connection.h"
ServerConnection::ServerConnection(string myOwnArg, string …Run Code Online (Sandbox Code Playgroud) 我试图通过使用变量方法名称来调用超类的方法.通常,我会看到以下两行代码是等效的:
someObj.method()
someObj.__getattribute__( 'method' )()
Run Code Online (Sandbox Code Playgroud)
事实上,我相信,这也是我使用第一行时实际发生的事情.但是,在下面的示例中,第二行产生了一个奇怪的问题.
我super用来构造一个超级对象并调用超类的方法.直接执行它可以按预期工作,但是使用__getattribute__首先获取方法会导致无限循环,它会一次又一次地调用子类的方法.
请参阅以下代码:
class A:
def example ( self ):
print( 'example in A' )
class B ( A ):
def example ( self ):
print( super( B, self ).example )
print( super( B, self ).__getattribute__( 'example' ) )
super( B, self ).example()
#super( B, self ).__getattribute__( 'example' )()
print( 'example in B' )
x = B()
x.example()
Run Code Online (Sandbox Code Playgroud)
如果你运行该代码,一切都按预期工作,你应该得到类似于这样的输出:
<bound method B.example of <__main__.B object at 0x01CF6C90>>
<bound method B.example of …Run Code Online (Sandbox Code Playgroud) 如何向某些超类发送消息?例如:
@interface A: NSObject;
@interface B: A;
@interface C: B;
@implementation C
- (id)init {
[super init];
}
Run Code Online (Sandbox Code Playgroud)
,其中"超级"是A级,但不是B级
我还在努力学习java,如果我错了,请纠正我.据我所知,super关键字调用类的构造函数.所以我不明白说什么意义
super.paint(g)
Run Code Online (Sandbox Code Playgroud)
例如,或者最近在阅读我遇到的动画时
super.addNotify()
Run Code Online (Sandbox Code Playgroud)
我试着查看关于两者的文档(可能很差)并且它不能充分满足我的好奇心,所以我们在这里.
对这两个例子或一般情况的任何澄清将不胜感激.谢谢!
我想知道如何从Nth(2nd或3rd或Any)子类调用超级父类的构造函数.
class a{
public function __construct(){
echo "<br>In constructor of class A <br>";
}
}
class b extends a {
public function __construct(){
echo "<br>In constructor of class B <br>";
}
}
class c extends b {
public function __construct(){
parent::__construct();
echo "<br>In constructor of class C <br>";
}
}
$obj = new c;
Run Code Online (Sandbox Code Playgroud)
我需要在上面的类C的构造函数中进行哪些更改,其中调用父的构造函数.Parent :: __construct(); 引用B类的consructor,因为我需要从C类调用A类的构造函数.
我想问一个关于使用Canvas作为容器的聪明问题,但编写我的示例代码我偶然发现了一些奇怪的东西.这是迄今为止的代码:
import Tkinter as tk
class CCanvas(tk.Canvas):
def __init__(self,master,*args,**kwargs):
super(CCanvas,self).__init__(master=master,*args,**kwargs)
if __name__ == '__main__':
root= tk.Tk()
cc = CCanvas(root)
cc.pack()
root.mainloop()
Run Code Online (Sandbox Code Playgroud)
现在这段代码不应该做太多.CCanvas类继承自Canvas,没有实现任何东西,只调用超类的构造函数.我认为没有任何理由不这样做.然而,当我运行它时,我收到以下错误:
super(CCanvas,self).__init__(master=master,*args,**kwargs)
TypeError: must be type, not classobj
Run Code Online (Sandbox Code Playgroud)
任何人都可以向我解释这种行为,也许可以告诉我如何解决它?
当我尝试使用基本类的属性访问时,我得到一个异常super(),但是当我明确使用基类名时.这是派生类:
from CPSA_TransactionLogOutSet import CPSA_TransactionLogOutSet
class CPSA_TransactionFailureSet(CPSA_TransactionLogOutSet):
def __init__(self, connection, failedTransactionKey):
super().__init__(connection)
CPSA_TransactionLogOutSet.C_TRANS_TYP = "TRANS_FAIL"
super().C_TRANS_TYP = "TRANS_FAIL"
super().DefaultTableName = 'CPSA_TRANSACTION_LOG_IN'
super()._keyFields.append('J_TRANS_SEQ')
Run Code Online (Sandbox Code Playgroud)
但尝试创建实例会引发AttributeError异常:
AttributeError: 'super' object has no attribute 'C_TRANS_TYP'
Run Code Online (Sandbox Code Playgroud)
基类由一个__init__()方法和一组属性组成,这里只显示其中一个:
class CPSA_TransactionLogOutSet(Recordset):
def __init__(self, connection):
super().__init__(connection)
self.DefaultTableName = 'CPSA_TRANSACTION_LOG_OUT'
@property
def C_TRANS_TYP(self):
return self.GetValue('C_TRANS_TYP')
@C_TRANS_TYP.setter
def C_TRANS_TYP(self, value):
self.SetValue('C_TRANS_TYP', value)
Run Code Online (Sandbox Code Playgroud)
为什么我不能super()用来访问该C_TRANS_TYP物业?
我有以下程序:
public abstract class geometricFigure {
private int dim1, dim2;
public geometricFigure(int dim1, int dim2) {
super();
this.dim1 = dim1;
this.dim2 = dim2;
}
public geometricFigure() {
this.dim1 = 0;
this.dim2 = 0;
}
}
Run Code Online (Sandbox Code Playgroud)
我很难理解,super()参数化构造函数中的方法是做什么的.我在这里可以看到这个抽象类没有扩展任何类,我很难理解super()它所调用的超类是什么方法.
顺便说一句.这个类由另外两个名为Echilateral Triangle和的类扩展Circle.
public class echilateralTriangle extends geometricFigure {
public echilateralTriangle() {
super(1, 1);
}
public echilateralTriangle(int dim1, int dim2) {
super(dim1, dim2);
}
}
Run Code Online (Sandbox Code Playgroud)
圈级:
public class Circle extends geometricFigure {
public Circle() {
super(1, 1); …Run Code Online (Sandbox Code Playgroud) super ×10
python ×4
java ×3
class ×2
constructor ×2
superclass ×2
c ×1
c++ ×1
call ×1
canvas ×1
inheritance ×1
objective-c ×1
php ×1
slots ×1
tkinter ×1