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 · 95 天前 · 1257 次点击
    这是一个创建于 95 天前的主题,其中的信息可能已经有所发展或是发生改变。

    腾讯云最新优惠活动来了:云产品限时1折,云服务器低至88元/年 ,点击这里立即抢购:9i0i.cn/qcloud,更有2860元代金券免费领取,付款直接抵现金用,点击这里立即领取:9i0i.cn/qcloudquan

    (福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

    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  
       95 天前
    没办法
    Leviathann
        2
    Leviathann  
       95 天前
    改成 getter
    wkj89
        3
    wkj89  
       95 天前
    2 楼说的对 覆写__attr__相关函数
    plko345
        4
    plko345  
    OP
       95 天前
    @Leviathann
    @wkj89
    是改为 `print(getattr(Base1, 'CLIENT'))` 这样吗? 试了不行, 应该是我理解错了吧
    wkj89
        5
    wkj89  
       95 天前
    覆写__getattr__ 函数 但是没啥意义 还不如重复定义 client
    error451
        6
    error451  
       95 天前
    这么搞就不符合类设计的逻辑
    类静态变量,你却要求他是可变的, 为什么要这样呢?
    XIVN1987
        7
    XIVN1987  
       95 天前
    ``` 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
       95 天前
    @error451 恩, 我想应该是我的设计有问题, 我把这部分移到类外部处理试试
    wkj89
        9
    wkj89  
       95 天前
    @plko345
    你按 7 楼的方法就行
    Alias4ck
        10
    Alias4ck  
       95 天前   ?? 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   ·   实用小工具   ·   5912 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 01:32 · PVG 09:32 · LAX 18:32 · JFK 21:32
    Developed with CodeLauncher
    ? Do have faith in what you're doing.


    http://www.vxiaotou.com