【视频笔记】python迷惑行为:我继承我自己

一般的,如B继承A

class A:
    pass

class B(A):
    pass

那A能不能继承自己呢? 虽然有报警,但是运行不报错。

 给A类添加一些属性

class A:
    def __init__(self):
        self.x = 10
    pass

class A(A):
    def __init__(self):
        super().__init__()
        self.y = 20
    pass

a = A()
print(a.x, a.y)

--- colsole 打印 ---
10 20

 可以在继承类中修改父类的属性,结果时可以覆盖

class A:
    def __init__(self):
        self.x = 10
    pass

class A(A):
    def __init__(self):
        super().__init__()
        self.y = 20
        self.x = 30
    pass

a = A()
print(a.x, a.y)

 

又如:

dic = {"a": 1, "b": 2, "c": 3}
# 并等于
dic |= {"d": 4, "e": 5}

print(dic)

--- console打印, d、e是并进来了 ---
{'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}

本质上就是扩容一下自己的意思。

如果有一个字段重了,就相当于给他重新修改一下它的对应的值,如下c给改成6了

dic = {"a": 1, "b": 2, "c": 3}
#
dic |= {"d": 4, "e": 5, "c": 6}

print(dic)

--- console打印 --- 
{'a': 1, 'b': 2, 'c': 6, 'd': 4, 'e': 5}

不仅我们自己可以继承我们原来的那些类,也可以给他魔改一下,int类继承object

class int(object):

我们就可以,怎么招啊?class一个int继承一下

class int(int):
    def __new__(cls, *args, **kwargs):
        res = super().__new__(cls, *args, **kwargs)
        res.y = 10
        return res

a = int("10_000")
print(a)
print(a.y)

--- console打印 ---
10000
10

这样就实现了往int类型上偷偷绑一个小变量y的意思

安全问题代码

class int(int):
    def __new__(cls, *args, **kwargs):
        res = super().__new__(cls, *args, **kwargs)
        import random
        # 1%概率,会在不知情情况下加1
        if random.random() < 0.01:
            res += 1
        return res


a = int("10_000")
print(a)

类可以魔改,函数也可以魔改,比如这个print

_print = print

def print(*args, **kwargs):
    # 调用原来的print执行打印
    _print(*args, **kwargs)
    # 返回这个print
    return print

print("hello")("world")

--- console打印---
hello
world

还可以混淆代码的作用,让不怎么听课抄作业的萌新看不懂

class A:
    def __new__(cls, *args, **kwargs):
        return A

class A(A()()()(A(A(A(A(A())))))):
    pass

它其实不叫怎我继承,原来的那个class MyClass, 这里MyClass只是一个名字,真正的对象是他背后的那个类的对象,我们这个myclass只是指向去 只是一个我们背后myclass对象的那个类对象的一个引用,然后当我们又写了一个myclass的话,只是覆盖了原有的这个名字(MyClass)

参考:python迷惑行为:我继承我自己_哔哩哔哩_bilibili

posted @ 2025-06-14 21:07  fanblog  阅读(6)  评论(0)    收藏  举报