时间:2023-05-08 04:45:02 | 来源:网站运营
时间:2023-05-08 04:45:02 来源:网站运营
python命名空间:def func(): a = 1func()print(a)
运行结果:NameError: name 'a' is not defined
3、在内置: 不能使用局部和全局的名字的内置>全局>局部
def max(): print("in max func")max()
运行结果:in max func
在正常情况下,直接使用内置的名字 当我们在全局定义了和内置名字空间中同名的名字时,就会使用全局的名字 一级一级找# 函数名() 函数的调用# 加入id 就是函数的内存地址def max(): print("in max func")print(max)print(id(max))
运行结果:<function max at 0x0000025D7091D9D8>2600343820760
class ClassDemo(object): def run(self): raise NotImplementedErrorclass ChildClass(ClassDemo): def run(self): print("Hello world")ChildClass().run()
class ClassDemo(object): def run(self): raise NotImplementedError def wrong(self): # Will raise a TypeError NotImplemented = "don't do this" return NotImplementedclass ChildClass(ClassDemo): def run(self): print("Hello world") def wrong(self): print("wrong")ChildClass().run() # Hello worldwrong = ClassDemo().wrong()print(wrong) # don't do this
这里区分下 NotImplemented && NotImplementedErrortype(NotImplemented)<class 'NotImplementedType'> type(NotImplementedError)<class 'type'>issubclass(NotImplementedError,Exception)True
NotImplemented 是 Python 内建命名空间内仅有的 6 个常量(Python 中没有真正的常量)之一, 其它几个分别是 False、True、None、Ellipsis 和__debug__
。__eq__()、__lt__()
等等,表示该类型无法和其它类型进行对应的二元运算class A(object): def __init__(self, value): self.value = value def __eq__(self, other): if isinstance(other, A): print('Comparing an A with an A') return other.value == self.value if isinstance(other, B): print('Comparing an A with a B') return other.value == self.value print('Could not compare A with the other class') return NotImplementedclass B(object): def __init__(self, value): self.value = value def __eq__(self, other): # raise NotImplementedError if isinstance(other, B): print('Comparing a B with another B') return other.value == self.value print('Could not compare B with the other class') return NotImplementeda, b = A(1), B(1)aa, bb = A(1), B(1)a == aa # Trueb == bb # Truea == b # Trueb == a # True
运行结果:Comparing an A with an AComparing a B with another BComparing an A with a B
说明 == 运算符执行时会先寻找 B 的 __eq__()
方法, 遇到 NotImplemented 返回值则反过来去寻找 A 的 __eq__()
方法。NotImplementedError 是 RuntimeError 的子类: issubclass(NotImplementedError, RuntimeError) # True
官网 的建议是当你需要一个方法必须覆盖才能使用时,其效果类似于 Java 中的接口,用于定义一个未实现的抽象方法。
关键词:空间,命名