python 基类初始化_python – 使用parent初始化子类

本文探讨了如何在Python中优雅地使用基类初始化子类的方法。通过一个示例,展示了如何避免复杂性,直接访问父类属性进行初始化。作者建议使用类方法`from_parent`来创建子类实例,而不是通过静态方法提取参数。同时提醒,这种初始化方式可能需要考虑是否真的需要继承,因为有时可能会引入不必要的复杂性。
摘要由CSDN通过智能技术生成

有一个父母和一个孩子课我想

使用父实例初始化子类.

我的方式看起来很麻烦(见下文):

我定义了一个static方法来提取父初始化的init参数:

class Parent(object):

@staticmethod

get_init_params(parent_obj):

a = parent_obj.a

b = parent_obj.b

return (a, b)

def __init__(self, a, b):

self.a = a

self.b = b

class Child(Parent):

def __init__(self, parent):

super(Parent, self).__init__(*get_init_params(parent))

可能有更直接的方式吗?

编辑现在课程更简单

解决方法:

我想你想要将一个初始化Child对象的概念与从Parent创建一个对象的概念分开. get_init_params只是添加了一层你不需要的复杂性;直接访问属性.

class Child(Parent):

@classmethod

def from_parent(cls, parent):

return cls(parent.a, parent.b)

def __init__(self, a, b):

super(Child, self).__init__(a, b)

# Note: the fact that yo have to do this,

# or not call the parent's __init__ in the first

# place, makes me question whether inheritance

# is the right tool here.

self.a = revert_change(self.a)

self.b = revert_change(self.b)

p = Parent(3, 5)

c1 = Child.from_parent(p)

c2 = Child(6, 6)

如果对从父项获取的值进行更改,请在创建Child对象之前将它们应用于to_parent.

def from_parent(cls, parent):

return cls(revert_change(parent.a), revert_change(parent.b))

# Or, if you save the original values

# return cls(parent.orig_a, parent.orig_b)

标签:python,inheritance

来源: https://codeday.me/bug/20190829/1764020.html

Python的抽象基类(Abstract Base Class,简称ABC)是一种特殊的类,它定义了一组抽象方法,这些方法必须在子类实现。ABC的一个主要用途是为了检查子类是否符合某个接口的规范。 在ABC,可以使用`__subclasshook__`方法来判断一个类是否是该ABC的虚拟子类。具体来说,如果一个类没有直接继承该ABC,但是它的基类有`__subclasshook__`方法,而且该方法返回True,则该类就被视为该ABC的虚拟子类。 下面是一个例子,我们定义了一个ABC `MyABC`,其定义了一个抽象方法`my_method`。然后定义了一个普通类`MyClass`,它继承自`object`,并且实现了`my_method`方法。最后,我们在`MyClass`定义了`__subclasshook__`方法,它判断一个类是否实现了`my_method`方法。 ```python from abc import ABC, abstractmethod class MyABC(ABC): @abstractmethod def my_method(self): pass class MyClass(object): def my_method(self): print("MyClass.my_method() is called") @classmethod def __subclasshook__(cls, C): if cls is MyABC: if hasattr(C, 'my_method'): return True return NotImplemented print(issubclass(MyClass, MyABC)) # True ``` 在上面的代码,我们使用`issubclass`函数来检查`MyClass`是否是`MyABC`的子类。由于`MyClass`实现了`my_method`方法,而且定义了`__subclasshook__`方法,因此`issubclass(MyClass, MyABC)`返回True。 接下来我们实现一个自己的虚拟子类。我们定义一个普通类`MyClass2`,它没有直接继承自`MyABC`,但是它的基类定义了`__subclasshook__`方法,该方法判断一个类是否实现了`my_method`方法。然后我们通过`register`方法将`MyClass2`注册为`MyABC`的虚拟子类。 ```python class MyClass2(object): def my_method(self): print("MyClass2.my_method() is called") @classmethod def __subclasshook__(cls, C): if cls is MyABC: if hasattr(C, 'my_method'): return True return NotImplemented MyABC.register(MyClass2) print(issubclass(MyClass2, MyABC)) # True ``` 在上面的代码,我们使用`register`方法将`MyClass2`注册为`MyABC`的虚拟子类。然后我们再次使用`issubclass`函数来检查`MyClass2`是否是`MyABC`的子类。由于`MyClass2`实现了`my_method`方法,并且已经被注册为`MyABC`的虚拟子类,因此`issubclass(MyClass2, MyABC)`返回True。 总之,`__subclasshook__`方法是ABC的一个重要方法,它可以让我们方便地判断一个类是否符合某个接口的规范。同时,我们也可以通过`register`方法将一个普通类注册为ABC的虚拟子类
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值