【视频笔记】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)
浙公网安备 33010602011771号