有没有办法在C#中的Python中完成classmethod
的工作?
也就是说,一个静态函数将根据其使用的子类来获取Type对象作为(隐式)参数。
我大概想要的一个例子是
class Base:
@classmethod
def get(cls, id):
print "Would instantiate a new %r with ID %d."%(cls, id)
class Puppy(Base):
pass
class Kitten(Base):
pass
p = Puppy.get(1)
k = Kitten.get(1)
预期的输出是
Would instantiate a new <class __main__.Puppy at 0x403533ec> with ID 1.
Would instantiate a new <class __main__.Kitten at 0x4035341c> with ID 1.
(same code on codepad here.)
最佳答案
原则上,您可以这样写:
class Base
{
public static T Get<T>(int id)
where T : Base, new()
{
return new T() { ID = id };
}
public int ID { get; set; }
}
然后,您可以编写
var p = Base.Get<Puppy>(10)
。或者,如果您感到受虐,则可以编写Puppy.Get<Puppy>(10)
甚至Kitty.Get<Puppy>
;)在所有情况下,您都必须显式而不是隐式地传递类型。另外,这也可以:
class Base<T> where T : Base<T>, new()
{
public static T Get(int id)
{
return new T() { ID = id };
}
public int ID { get; set; }
}
class Puppy : Base<Puppy>
{
}
class Kitten : Base<Kitten>
{
}
您仍然需要将类型传递回基类,这使您可以按预期方式编写
Puppy.Get(10)
。但是,当
var p = new Puppy(10)
既简洁又惯用时,还是有理由这样写吗?可能不会。关于c# - 适用于C#的Python风格的类方法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2058884/