V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
plko345
V2EX  ›  Python

Python 类继承时覆盖类属性的问题

  •  
  •   plko345 · 284 天前 · 1491 次点击
    这是一个创建于 284 天前的主题,其中的信息可能已经有所发展或是发生改变。
    class Base(object):
        PRODUCT = 1
    
        CLIENT = PRODUCT * 10
    
    
    class Base1(Base):
        PRODUCT = 2
    
    
    print(Base.CLIENT)
    print(Base1.CLIENT)
    

    请问 Base1 的 CLIENT 要怎么才能变成 20, 不重复写 CLIENT 的表达式情况下

    10 条回复    2024-02-07 19:14:57 +08:00
    yingxiangyu
        1
    yingxiangyu  
       284 天前
    没办法
    Leviathann
        2
    Leviathann  
       284 天前
    改成 getter
    wkj89
        3
    wkj89  
       284 天前
    2 楼说的对 覆写__attr__相关函数
    plko345
        4
    plko345  
    OP
       284 天前
    @Leviathann
    @wkj89
    是改为 `print(getattr(Base1, 'CLIENT'))` 这样吗? 试了不行, 应该是我理解错了吧
    wkj89
        5
    wkj89  
       284 天前
    覆写__getattr__ 函数 但是没啥意义 还不如重复定义 client
    error451
        6
    error451  
       284 天前
    这么搞就不符合类设计的逻辑
    类静态变量,你却要求他是可变的, 为什么要这样呢?
    XIVN1987
        7
    XIVN1987  
       284 天前
    ``` python
    class Base(object):
    PRODUCT = 1

    @property
    def CLIENT(self):
    return self.PRODUCT * 10


    class Base1(Base):
    PRODUCT = 2


    print(Base().CLIENT)
    print(Base1().CLIENT)
    ```
    plko345
        8
    plko345  
    OP
       284 天前
    @error451 恩, 我想应该是我的设计有问题, 我把这部分移到类外部处理试试
    wkj89
        9
    wkj89  
       284 天前
    @plko345
    你按 7 楼的方法就行
    Alias4ck
        10
    Alias4ck  
       284 天前   ❤️ 1
    可以用描述器解决你的问题

    ```
    class ClientDescriptor:
    def __get__(self, instance, owner):
    return owner.PRODUCT * 10
    class Base(object):
    PRODUCT = 1
    CLIENT = ClientDescriptor()
    class Base1(Base):
    PRODUCT = 2

    ```
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1095 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 18:39 · PVG 02:39 · LAX 10:39 · JFK 13:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.