Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中一次定义和实例化派生类?_Python_Inheritance - Fatal编程技术网

如何在python中一次定义和实例化派生类?

如何在python中一次定义和实例化派生类?,python,inheritance,Python,Inheritance,我有一个要一起派生和实例化的基类。我可以用java这样做: BaseClass derivedClassInstance = new BaseClass() { @override void someBaseClassMethod() { // my statements} }; 在python中,我可以派生和实例化基类,如: class DerivedClass(BaseClass): def some_base_class_method(): # m

我有一个要一起派生和实例化的基类。我可以用java这样做:

BaseClass derivedClassInstance = new BaseClass() {
    @override
    void someBaseClassMethod() { // my statements}
};
在python中,我可以派生和实例化基类,如:

class DerivedClass(BaseClass):
    def some_base_class_method():
        # my statements

derived_class_instance = DerivedClass()
我需要对一些对象的单个实例进行子分类,并进行一些小的更改。分别推导和分配它们似乎有些过分


是否有一种类似Java的单行程序方式来动态派生和实例化类?或者有没有更简洁的方法来完成我在python中所做的工作?

我想您正在寻找元类编程

class Base(object):
   def test(self):
      print 'hit'
a =type( 'Derived',(Base,),{})()
a.test()
hit

我认为您正在寻找元类编程

class Base(object):
   def test(self):
      print 'hit'
a =type( 'Derived',(Base,),{})()
a.test()
hit

一般来说,您不会看到这种代码,因为它很难阅读和理解。我真的建议你找一些替代品,避免接下来发生的事情。话虽如此,您可以在一行中创建一个类和一个实例,如下所示:

>>> class BaseClass(object):
...     def f1(self, x):
...             return 2
...     def f2(self, y):
...             return self.f1(y) + y
... 
>>> 
>>> W = BaseClass()
>>> W.f2(2)
4
>>> X = type('DerivedClass', (BaseClass,), {'f1': (lambda self, x: (x + x))})()
>>> X.f2(2)
6

一般来说,您不会看到这种代码,因为它很难阅读和理解。我真的建议你找一些替代品,避免接下来发生的事情。话虽如此,您可以在一行中创建一个类和一个实例,如下所示:

>>> class BaseClass(object):
...     def f1(self, x):
...             return 2
...     def f2(self, y):
...             return self.f1(y) + y
... 
>>> 
>>> W = BaseClass()
>>> W.f2(2)
4
>>> X = type('DerivedClass', (BaseClass,), {'f1': (lambda self, x: (x + x))})()
>>> X.f2(2)
6

考虑使用除继承以外的工具进行此操作。也许无论您使用方法重写实现什么行为,您都可以将其作为回调或其他方式传递给父级。如果基类是模板方法,您将无法传递回调或lambda。@user2357112感谢您的建议。我不熟悉python中的回调。我会调查的。VZ0的答案是足够的威慑力。考虑使用除继承以外的工具。也许无论您使用方法重写实现什么行为,您都可以将其作为回调或其他方式传递给父级。如果基类是模板方法,您将无法传递回调或lambda。@user2357112感谢您的建议。我不熟悉python中的回调。我会调查的。VZ0的回答是一个足够的威慑力。O00考虑我。