瑞安DELUCCHI问这里的评论#3 汤姆Hawtin的回答是:
为什么Class.newInstance()"邪恶"?
这是为了响应代码示例:
// Avoid Class.newInstance, for it is evil.
Constructor<? extends Runnable> ctor = runClass.getConstructor();
Runnable doRun = ctor.newInstance();
Run Code Online (Sandbox Code Playgroud)
那么,为什么它是邪恶的?
以下面的课程为例:
class Sometype
{
int someValue;
public Sometype(int someValue)
{
this.someValue = someValue;
}
}
Run Code Online (Sandbox Code Playgroud)
然后我想使用反射创建这种类型的实例:
Type t = typeof(Sometype);
object o = Activator.CreateInstance(t);
Run Code Online (Sandbox Code Playgroud)
通常这会起作用,但是由于SomeType没有定义无参数构造函数,调用Activator.CreateInstance将抛出类型异常,MissingMethodException并带有消息" 没有为此对象定义无参数构造函数. "是否还有另一种方法可以创建此类型的实例?将无参数构造函数添加到我的所有类中会有点麻烦.
我需要获取一个字符串参数,并在Python中创建该字符串中指定的类的对象.在Java中,我会使用Class.forName().newInstance().Python中有相应的东西吗?
谢谢你的回复.要回答那些想知道我在做什么的人:我想使用命令行参数作为类名,并实例化它.我实际上是在Jython中编程并实例化Java类,因此问题的Java-ness. getattr()效果很好.非常感谢.
在什么情况下我应该在做:base()和:this() 构造函数调用以下我的构造函数的括号内(甚至在代码的其他地方).这些什么时候称为良好做法,什么时候强制执行?
我一直认为 - 在没有构造函数参数的情况下 - 括号(花括号)在创建类实例时遵循类名,是可选的,并且您可以根据自己的想法包含或排除它们.
这两个陈述是平等的:
$foo = new bar;
$foo = new bar();
Run Code Online (Sandbox Code Playgroud)
我对吗?或者对我不知道的括号有一些意义吗?
我知道这听起来像一个RTM问题,但我一直在寻找(包括整个PHP OOP部分),我似乎无法找到一个直接的答案.
我们如何从Ruby-on-Rails中的名称字符串中实例化类?
例如,我们在数据库中以"ClassName"或"my_super_class_name"的格式命名.
我们如何从中创建对象?
解:
正在寻找它,但没找到,所以在这里. Ruby-on-Rails API方法
name = "ClassName"
instance = name.constantize.new
Run Code Online (Sandbox Code Playgroud)
它甚至可以不格式化,我们可以用户字符串方法.classify
name = "my_super_class"
instance = name.classify.constantize.new
Run Code Online (Sandbox Code Playgroud)
当然也许这不是'Rails方式',但它解决了它的目的.
所以我想说我想写一本字典.我们称之为d.但是有多种方法可以在Python中初始化字典!例如,我可以这样做:
d = {'hash': 'bang', 'slash': 'dot'}
Run Code Online (Sandbox Code Playgroud)
或者我可以这样做:
d = dict(hash='bang', slash='dot')
Run Code Online (Sandbox Code Playgroud)
或者,奇怪的是:
d = dict({'hash': 'bang', 'slash': 'dot'})
Run Code Online (Sandbox Code Playgroud)
或这个:
d = dict([['hash', 'bang'], ['slash', 'dot']])
Run Code Online (Sandbox Code Playgroud)
以及其他多种方式的dict()功能.显然,dict()提供的一件事是语法和初始化的灵活性.但这不是我要问的问题.
说我d只做一本空字典.当我做什么那张Python解释器的幕后d = {}对d = dict()?它只是两种方式来做同样的事情?使用是否{}有额外的电话dict()?是否有一个(甚至可以忽略不计)比另一个更多的开销?虽然这个问题真的完全不重要,但我很乐意回答这个好奇心.
我只是注意到在构造对象时使用{}而不是()给出相同的结果.
class Customer
{
public string name;
public string ID {get; set;}
}
static void Main()
{
Customer c1= new Customer{}; //Is this a constructor?
Customer c2= new Customer();
//what is the concept behind the ability to assign values for properties
//and fields inside the {} and is not allowable to do it inside ()
//without defining a constructor:
Customer c3= new Customer{name= "John", ID="ABC"};
}
Run Code Online (Sandbox Code Playgroud)
是否{}像()建立在C#中的新对象时?
有没有办法绕过__init__python中的类的构造函数?
例:
class A(object):
def __init__(self):
print "FAILURE"
def Print(self):
print "YEHAA"
Run Code Online (Sandbox Code Playgroud)
现在我想创建一个实例A.它可能看起来像这样,但是这种语法不正确.
a = A
a.Print()
Run Code Online (Sandbox Code Playgroud)
编辑:
一个更复杂的例子:
假设我有一个对象C,其目的是存储一个参数并对其进行一些计算.但是,该参数不是这样传递的,而是嵌入在一个巨大的参数文件中.它可能看起来像这样:
class C(object):
def __init__(self, ParameterFile):
self._Parameter = self._ExtractParamterFile(ParameterFile)
def _ExtractParamterFile(self, ParameterFile):
#does some complex magic to extract the right parameter
return the_extracted_parameter
Run Code Online (Sandbox Code Playgroud)
现在我想转储并加载该对象的实例C.但是,当我加载这个对象时,我只有单个变量self._Parameter,我无法调用构造函数,因为它期望参数文件.
@staticmethod
def Load(file):
f = open(file, "rb")
oldObject = pickle.load(f)
f.close()
#somehow create newObject without calling __init__
newObject._Parameter = oldObject._Parameter
return newObject
Run Code Online (Sandbox Code Playgroud)
换句话说,如果不传递参数文件,则无法创建实例.在我的"真实"的情况,但是,它不是一个参数文件,但一些大数据的垃圾我当然不希望在内存中随身携带,甚至将其存储到光盘上.
因为我想C从方法返回一个实例,Load …
instantiation ×10
class ×4
c# ×3
constructor ×3
java ×3
python ×3
oop ×2
.net ×1
inheritance ×1
php ×1
reflection ×1
runtime ×1
string ×1