Python之类

117 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第6天,点击查看活动详情

class

把数据与功能绑定在一起。创建新类就是创建新的对象 类型,从而创建该类型的新 实例 。类实例支持维持自身状态的属性,还支持(由类定义的)修改自身状态的方法。

作用域和命名空间

作用域 是命名空间可直接访问的 Python 程序的文本区域。 “可直接访问” 的意思是,对名称的非限定引用会在命名空间中查找名称。

namespace (命名空间)是映射到对象的名称。

def scope_test():
    def do_local():
        spam = "local spam"

    def do_nonlocal():
        nonlocal spam
        spam = "nonlocal spam"

    def do_global():
        global spam # 全局变量
        spam = "global spam"

    spam = "test spam"
    do_local()
    print("After local assignment:", spam)
    do_nonlocal()
    print("After nonlocal assignment:", spam)
    do_global()
    print("After global assignment:", spam)
scope_test()
print("In global scope:", spam)

#  注意,局部 赋值(这是默认状态)不会改变 scope_test 对 spam 的绑定。
#  nonlocal 赋值会改变 scope_test 对 spam 的绑定,而 global 赋值会改变模块层级的绑定。
After local assignment: test spam
After nonlocal assignment: nonlocal spam
After global assignment: nonlocal spam
In global scope: global spam

类例子

class  Dog():
    """一次模拟小狗的简单尝试"""
    
    def __init__(self, name, age):
        """初始化属性 name 和 age"""
        self.name = name
        self.age =  age
        
    def   sit(self):
        """模拟小狗收到指令蹲下"""
        print(f"{self.name} is now sitting.")
    
    def roll_over(self):
        """模拟小狗收到指令打滚"""
        print(f"{self.name} rolled over!!!")
    
my_dog = Dog('dog', 6)
del my_dog.name
# print(my_dog.name)
print(my_dog.age)
6

继承

派生类可能会重写其基类的方法。 因为方法在调用同一对象的其他方法时没有特殊权限,所以调用同一基类中定义的另一方法的基类方法最终可能会调用覆盖它的派生类的方法。 (对 C++ 程序员的提示:Python 中所有的方法实际上都是 virtual 方法。) Python有两个内置函数可被用于继承机制:

使用 isinstance() 来检查一个实例的类型: isinstance(obj, int) 仅会在 obj.class 为 int 或某个派生自 int 的类时为 True。

使用 issubclass() 来检查类的继承关系: issubclass(bool, int) 为 True,因为 bool 是 int 的子类。 但是,issubclass(float, int) 为 False,因为 float 不是 int 的子类。 Python 也支持一种多重继承。 带有多个基类的类定义语句如下所示:

class DerivedClassName(Base1, Base2, Base3):
    <statement-1>
    .
    .
    .
    <statement-N>
        
        

  Input In [17]
    <statement-1>
    ^
SyntaxError: invalid syntax

对于多数应用来说,在最简单的情况下,

你可以认为搜索从父类所继承属性的操作是深度优先、从左至右的,

当层次结构中存在重叠时不会在同一个类中搜索两次。

因此,如果某一属性在 DerivedClassName 中未找到,

则会到 Base1 中搜索它,然后(递归地)到 Base1 的基类中搜索,

如果在那里未找到,再到 Base2 中搜索,依此类推。