在Python中扩展对象的干净利落的方法

2024-05-23 18:29:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我基本上陷入了对象属性继承和扩展基类方法的双重问题。你知道吗

我正在重构我的代码,以遵循枯燥的规则,并讨论最佳的设计解决方案。你知道吗

有没有一种简洁而优雅的方法使对象从基类继承属性并扩展其现有方法

不映射对象B中对象A的所有属性 *没有一堆装饰和财产?*

似乎不允许访问基类对象的属性

示例:

class A():
    def __init__(self):
        self.x = "whatever"
        self.y= "cumbersome"
        self.z = "idea"
    def method1(self):
        self.x = self.x.lower()

class B(A):
    def __init__(self):
        self.a = 87
    @method1 
    def method1extended(self):
        self.y =self.y.upper()
  • 第一个问题:

b=b() b、 y没有设置,所以我想我们应该使用setter和getter装饰器

  • 第二个问题

method1不容易扩展,也不允许访问由method1extended转换的self.x或self.y,它总是指出self.y的初始值

即使尝试使用super(),也需要重写整个函数

有一个优雅的解决方案吗?你知道吗


Tags: 对象方法代码self属性initdef装饰
1条回答
网友
1楼 · 发布于 2024-05-23 18:29:07

请使用以下代码进行尝试。你知道吗

class A(object):
    def __init__(self):
        self.x = "whatever"
        self.y= "cumbersome"
        self.z = "idea"

    def method1(self):
        self.x = self.x.lower()

class B(A):
    def __init__(self):
         super(B, self).__init__()
         self.a = 87

    def method1(self):
         super(B, self).method1()
         self.y =self.y.upper()

我们改变了很多事情:

  • 我们从object添加了A子类来获得一个新样式的类。(请注意,这仅适用于python版本2)
  • 我们在A.__init__中添加了对object.__init__的调用。Python不会隐式地为您调用这些,您必须自己调用。你知道吗
  • B.__init__现在调用A.__init__。这同样需要你来做。你知道吗
  • B.method1extended重命名为B.method1,这样它就隐藏了A.method1。你知道吗
  • B.method1在应用自己的更改之前调用A.method1。你知道吗

相关问题 更多 >