Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.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_Class_Object_Design Patterns_Multiple Inheritance - Fatal编程技术网

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

在Python中扩展对象的干净干练的方法,python,class,object,design-patterns,multiple-inheritance,Python,Class,Object,Design Patterns,Multiple Inheritance,我基本上陷入了对象属性继承和扩展基类方法的双重问题 我正在重构我的代码,以遵循枯燥的原则,并讨论最佳设计解决方案 有没有一种简单而优雅的方法可以使对象从基类继承属性并扩展其现有方法 不映射对象B中对象A的每个属性 *没有一堆装饰师和财产?* 似乎不允许访问基类对象的属性 例如: class A(): def __init__(self): self.x = "whatever" self.y= "cumbersome" self.z = "

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

我正在重构我的代码,以遵循枯燥的原则,并讨论最佳设计解决方案

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

不映射对象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无法轻松扩展,并且不允许访问Method1Extented转换的self.x或self.y始终指出初始self.y值

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


是否有一个优雅的解决方案?

用以下代码尝试一下

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中添加了对
    对象的调用。Python不会为您隐式地调用这些,您必须自己来做
  • B.。\uuuu init\uuuu
    现在调用
    A.\uuuu init\uuuu
    。这同样需要你来完成
  • B.method1扩展
    重命名为
    B.method1
    ,使其阴影
    A.method1
  • B.method1
    在应用自己的更改之前调用
    A.method1

我不清楚您想做什么。请您添加一些代码,说明您打算如何使用这些类,例如
b=b();print(b.y)
您希望发生什么?实际上,我的第一个超类是一个页面工厂,它创建了一个具有页面通用属性的对象。给定页面属性(例如type、itle等),它将创建第三个特定对象,扩展页面对象方法,并通过修改继承的属性创建新属性。此代码只是简化设计问题的一种方法