Inherit Diamond

该博客探讨了如何在Python3中处理钻石继承问题,同时关注由此可能引发的多重调用和其他潜在风险。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以下代码 是解决钻石问题的多重调用及其他潜在风险!转载请注明出处,谢谢!

__Author__ = 'KaiAowisySun'

import os

if __name__ != '__main__':
    print(f"→ {os.path.abspath(__file__)} !")


#【钻石继承】


#       继承图:           mro图:
#       Person           Person
#       ↙  ↘                ↖
#  Father   Mother   Father → Mother
#       ↘  ↙            ↖
#        Son               Son
class Person(object):
    # tst0='test0' # 类属性,可以继承
    def __init__(self, name):
        self.__name = name
        # self.tst1='test1' # 实例属性(非参数化),可以继承
        print("Person init")
    def get_name(self):
        return self.__name
    def func1_cm(self): # 重名函数,与Mother中的重名
        print('Person func1_cm()')
class Mother(Person):
    def __init__(self, job, *args): # 另外如果参数中有list等类型,要再加上**kargs 。(这里的*扩展参数实际是为了多继承时的super()调用,可以让多继承中的多各类的参数衔接上)
        super(Mother, self).__init__(*args)
    # 这两句也可以替换为下两句↓,补全父类参数name,使得更明显得看出是要传入哪些参数。(但实际没必要,上两句得*args会自动获取父类参数。)
    # def __init__(self, name, job, *args):
    #     super(Mother, self).__init__(name,*args)
        self.__job = job
        print("Mother init")
    def get_job(self):
        return self.__job
    def func1_cm(self): # 重名函数
        print('Mother func1_cm()')
    def func2_cm(self): # 重名函数,与Father中的重名
        print('Mother func2_cm()')
class Father(Person):
    def __init__(self, age, *args):
        super(Father, self).__init__(*args)
    # def __init__(self, name, age):
    #     super(Father, self).__init__(name)
        self.__age = age
        print("Father init")
    def get_age(self):
        return self.__age
    def func2_cm(self): # 重名函数
        print('Father func2_cm()')
# __Author__ = 'KaiAowisySun'
# ↑单继承可用*args代替父类参数;↓多继承要把参数写全。
class Son(Father, Mother):
    # def __init__(self, gender, *args):
    #     super(Son, self).__init__(*args)
    def __init__(self, name, age, job, gender):
        # super(Son, self).__init__(name, age, job)
        super().__init__(name, age, job) # Python3 可以省略super()参数,等同上句。
        self.__gender = gender
        print("Son init")
    def get_gender(self):
        return self.__gender

print(Son.mro()) # mro就是类的方法解析顺序表, 即继承父类方法时的顺序表。

wo = Son('tom', 22, 'teacher', 'male')
print(wo.get_name(), wo.get_age(), wo.get_job(), wo.get_gender())
## print(wo.__name) # err. 类内部属性不可访问
# print(wo.tst0) # 实例属性(非参数化),可以继承
# print(wo.tst1) # 实例属性,可以继承(非参数化)
wo.func1_cm() # 多继承中若有同名方法继承,按顺序继承mro最近的。
wo.func2_cm()

# MRO/mro :Method Resolution Order,方法解析顺序,即继承顺序。
#   无论是 构造函数__init__(本类中无构造函数前提下)、属性、方法 继承都遵循mro 。
#   且构造函数的继承,在
#       python3 中:
#           继承都以广度优先。
#           (如在此例中,如果Son中没有构造函数__init__,则先去父类Fatjer中寻找,若无,再去Mother中找,若无,再去Person中找。并且(找到后)只继承一个父类中的构造函数。)
#       python2 中:
#           经典类写法继承以深度优先;
#           新式类写法继承以广度优先。<font size=5>

转载请注明出处,谢谢!

<think>好的,用户想了解CSS属性width设置为inherit的作用。首先,我需要回顾一下inherit这个值在CSS中的基本用法。inherit关键字用于让元素的某个属性继承其父元素的对应属性值。对于width属性来说,设置width: inherit;意味着该元素的宽度会继承其父元素的宽度。 接下来,我需要确认这个属性的具体效果。比如,假设有一个父div宽度为500px,子元素设置width: inherit;那么子元素的宽度也会变成500px。这在不同布局场景下可能很有用,尤其是当父元素的宽度不是固定值,而是根据响应式设计变化时,子元素可以自动调整宽度以适应父容器。 然后,考虑到用户可能遇到的常见问题,比如默认情况下某些元素的width属性是否继承。例如,div元素默认宽度是auto,即占据可用空间,而input等元素默认宽度可能由浏览器决定。使用inherit可以强制让这些元素继承父容器的宽度,这在表单元素布局时可能特别有用。 还需要注意inherit和其他值的区别,比如width: 100%。虽然两者在某些情况下效果相似,但inherit是直接继承父元素的计算值,而100%则是相对于父元素的包含块宽度。如果父元素有padding或border,使用100%可能会导致溢出,而inherit则可能考虑父元素的实际内容宽度,特别是当父元素使用box-sizing: border-box时。 此外,结合用户提供的引用内容,引用[1]提到box-sizing设置为border-box的情况,这可能影响width的行为。如果父元素使用了border-box,子元素继承宽度时会包含padding和border,而100%则可能不会,这可能导致不同的布局效果。需要解释inherit在这种情况下如何工作。 另外,引用[3]提到clip属性,虽然不直接相关,但可能用户对CSS属性如何影响布局有更广泛的兴趣,可能需要强调inherit在响应式设计中的优势。 最后,需要提供实际的使用示例,说明在不同场景下如何应用width: inherit,并比较其与其他方法的异同,帮助用户更好地理解何时使用该属性。同时,生成的相关问题应覆盖继承机制的其他属性、与百分比的区别以及实际应用案例,以扩展用户的理解。</think>### CSS属性`width: inherit`的作用及用法 `width: inherit`是CSS中用于**显式继承父元素宽度**的属性值。其核心作用是让当前元素的宽度与其父元素的宽度保持完全一致,适用于需要动态适应父容器尺寸的场景。 #### 一、基础作用 1. **直接继承父元素宽度** 当元素设置`width: inherit`时,其宽度会直接继承父元素的计算值。例如: ```html <div class="parent" style="width: 300px"> <div class="child" style="width: inherit"> <!-- 实际宽度为300px --> ``` 此时子元素的宽度与父元素完全一致。 2. **覆盖默认宽度行为** 部分元素(如`<input>`、`<img>`)的默认宽度由浏览器决定。通过`inherit`可强制继承父容器宽度: ```css input.custom-input { width: inherit; /* 使输入框宽度与父容器相同 */ } ``` #### 二、与`width: 100%`的区别 | 特性 | `inherit` | `100%` | |---------------------|------------------------------------|----------------------------------| | 计算基准 | 父元素的计算值(包含`box-sizing`) | 父元素内容区的宽度 | | 边框/内边距影响 | 受父元素`box-sizing`影响 | 可能导致溢出(需配合`box-sizing`)| | 动态响应 | 父元素宽度变化时自动同步 | 同样响应变化 | 示例对比: ```css .parent { width: 200px; padding: 20px; box-sizing: border-box; } .child-inherit { width: inherit; } /* 实际宽度200px */ .child-100percent { width: 100%; } /* 宽度160px (200-20*2) */ ``` #### 三、典型使用场景 1. **嵌套组件统一宽度** 在UI组件库开发中,确保内部元素与外部容器宽度一致: ```css .dropdown-menu { width: inherit; /* 与触发按钮同宽 */ } ``` 2. **表单元素自适应** 使输入框自动填充父容器: ```css .form-group { width: 400px; } .form-group > input { width: inherit; /* 自动填满400px宽度 */ } ``` 3. **覆盖框架默认样式** 当第三方CSS设置了固定宽度时,用`inherit`重置: ```css .reset-width { width: inherit !important; /* 强制继承父级宽度 */ } ``` #### 四、注意事项 1. **父元素必须有明确定义的宽度** 若父元素宽度为`auto`(如默认的`<div>`),`inherit`会表现为`auto`而非预期效果。 2. **与`min-width/max-width`的交互** 继承的宽度值仍受当前元素的`min-width`和`max-width`限制。 3. **性能影响** 在深层嵌套结构中频繁使用可能增加重排计算开销,建议配合CSS预处理器管理[^5]。 [^1]: 引用父元素计算值时需注意`box-sizing`的影响 [^5]: 深层样式覆盖需要注意选择器优先级
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值