python笔记 面向对象基础下

75 阅读2分钟

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

0 环境

  • 编辑器:pycharm或者vscode
  • 系统版本:windows10
  • python版本:3.9.6

1 对象的创建

当我们创建对象时,实际在执行__init__函数,那__init__函数到有啥,为啥一定要这么做呢,__init__函数里经常会看到self.xxx = xxx,有么有可能self就是定义的类名呢,代码如下:

我定义一个类,类名为Demo,并且只定义一个__init__函数,只做一件事打印self,然后我调用这个Demo(),并且打印出它的结果。结果是一样的,不会这个self就是我们的Demo吧。

class Demo:
    def __init__(self):
        print(id(self))

if __name__ == '__main__':
    demo = Demo()
    print(id(demo))

image.png

我只有执行了Demo()后,才会有demo这个对象,也就说我们纠结点就在于是先有self,还是先有__init__这个函数,__init__这个函数既没有return返回值,也没有生成器这类的手段(当然它放在这也不合适),无任何返回值的,也就说self不依赖__init__函数的,实际上,__init__函数的职责是初始化对象,不是用来创建对象的,在回过来想想,如上代码,id(self)的结果等价于id(demo),也就相当于__init__(demo,xxx),在对比一下高阶函数,是不是就可以得出一些结论了。初始化说白了就是为对象打工的。 那么对象创建的过程如下:

  • 先创建个对象。类似demo = Demo()。
  • 然后该对象作为个self,当__init__函数被执行时,当作参数传入给__init__函数。
  • 在然后self返回。

2 在类中定义方法和怎么调用

之前的status状态,需要我们手动赋值,有时候它是固定的状态,我可不可以换种方式展现呢,如下代码:

像下面代码定义的close,其实在类里,是被称为方法的。

class Demo1:
    def __init__(self, status):
        self.status = status

    def close(self):
        self.status = "closed"

if __name__ == '__main__':
    demo1 = Demo1("open")
    print(demo1.status)
    demo1.close()
    print(demo1.status)

image.png

3 总结

面向对象编程和函数编程还是有挺大差别的,首先self变量,我们可以把它看作固定的变量名,这个位置是固定的。一步步走下来,先定义好类,初始化和方法的定义,怎么创建对象,如何调用方法。