携手创作,共同成长!这是我参与「掘金日新计划 · 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))
我只有执行了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)
3 总结
面向对象编程和函数编程还是有挺大差别的,首先self变量,我们可以把它看作固定的变量名,这个位置是固定的。一步步走下来,先定义好类,初始化和方法的定义,怎么创建对象,如何调用方法。