我可以使用另一个类的属性而不扩展该类吗?

2024-09-30 18:25:42 发布

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

布雷夫:

我有两个类,它们包含一些相同的属性块对。 这些类共享一个共同的祖先,但也有不相同的兄弟姐妹 需要这些属性。你知道吗

我不想重复属性代码块。你知道吗

如果我使用getter:

在Getter中,我的方法是调用另一个类中的权威方法:

# in ConcreteFooz.baz_per_bar:
def baz_per_bar(self):
    return ConcreteFoo.baz_per_bar(self)

但我不使用getter

因为@properties似乎更适合我的需要。 当我尝试时:

# in ConcreteFooz.baz_per_bar:
def baz_per_bar(self):
    return ConcreteFoo.baz_per_bar(self)

我回来了:

*** TypeError: 'property' object is not callable

所以

我可以使用另一个类的属性而不扩展该类吗?你知道吗


示例代码

所以我们通常指的是:

import itertools

class MyBaseClass(object):
    pass

class ConcreteFoo(MyBaseClass):
    @property
    def baz_per_bar(self):
        """Returns as dict of {baz: list bar}"""
        # do baz lookup
        # do bar lookup
        # associcate and return
        return my_baz_per_bar

    @property
    def baz_chain(self):
        """Flattens baz_per_bar into baz's"""
        return itertools.chain(*self._baz_chain.values())

class ConcreteFooz(MyBaseClass):
    @property
    def baz_per_bar(self):
        """Returns as dict of {baz: list bar}"""
        # do baz lookup
        # do bar lookup
        # associcate and return
        return my_baz_per_bar

    @property
    def baz_chain(self):
        """Flattens baz_per_bar into baz's"""
        return itertools.chain(*self._baz_chain.values())

class ConcreteJaz(MyBaseClass):
    pass
    # Does not need property lookup

Tags: selfchainreturn属性defbarpropertybaz
2条回答

是的,您可以使用另一个类的属性而不扩展该类。考虑一下这个计划:

import itertools

class MyBaseClass(object):
    pass

class ConcreteFoo(MyBaseClass):
    def __init__(self):
        self.my_baz_per_bar = { 'A' : ['apple', 'aardvark'] }

    @property
    def baz_per_bar(self):
        """Returns as dict of {baz: list bar}"""
        # do baz lookup
        # do bar lookup
        # associcate and return
        return self.my_baz_per_bar

    @property
    def baz_chain(self):
        """Flattens baz_per_bar into baz's"""
        return itertools.chain(*self._baz_chain.values())

class ConcreteFooz(MyBaseClass):
    def __init__(self):
        self.my_baz_per_bar = { 'Z' : ['zero', 'zebra'] }

    baz_per_bar = ConcreteFoo.baz_per_bar
    baz_chain = ConcreteFoo.baz_chain

class ConcreteJaz(MyBaseClass):
    pass
    # Does not need property lookup

print ConcreteFoo().baz_per_bar
print ConcreteFooz().baz_per_bar

或者,考虑以下片段:

    @property
    def baz_per_bar(self):
        return ConcreteFoo.baz_per_bar.fget(self)

请注意,我确实修改了示例中的ConcreteFoo,但只是为了修复其中的NameError。你知道吗

我不太确定。米辛能满足你的需要吗?你知道吗

import itertools

class MyBaseClass(object):
    pass

class BazMixin():
    @property
    def baz_per_bar(self):
        """Returns as dict of {baz: list bar}"""
        # do baz lookup
        # do bar lookup
        # associcate and return
        return my_baz_per_bar

    @property
    def baz_chain(self):
        """Flattens baz_per_bar into baz's"""
        return itertools.chain(*self._baz_chain.values())


class ConcreteFoo(MyBaseClass, BazMixin):
    pass

class ConcreteFooz(MyBaseClass, BazMixin):
    pass

class ConcreteJaz(MyBaseClass):
    pass
    # Does not need property lookup

相关问题 更多 >