Python两个类中self参数的关系及代码运行等技术咨询
问题解答
问题1:代码的运行原理与执行流程
这是Python类继承与实例化的典型场景,核心逻辑是父类提供通用功能,子类继承并定制专属属性:
运行原理
Filter作为父类,定义了两个核心方法:init用于初始化实例的过滤黑名单blocked,filter是通用过滤逻辑——返回序列中不在黑名单内的元素。Spamfilter是Filter的子类,它直接继承了父类的filter方法,但重写了init方法,把默认黑名单固定为仅包含'spam'。
具体执行流程
Filter实例
f的执行步骤:f = Filter():创建一个Filter类的实例对象,赋值给变量f。f.init():调用f的init方法,给这个实例绑定一个名为blocked的属性,值为空列表[]。f.filter([1,2,3]):调用父类的filter方法,遍历传入的序列,因为f.blocked是空列表,所有元素都不在黑名单中,直接返回原序列[1, 2, 3]。
Spamfilter实例
s的执行步骤:s = Spamfilter():创建Spamfilter类的实例,由于继承了Filter,自动拥有filter方法。s.init():调用Spamfilter自身的init方法(重写了父类的),给s绑定blocked属性,值为['spam']。s.filter(...):调用继承来的filter方法,遍历传入的序列,筛选出所有不等于'spam'的元素,最终返回['eggs', 'bacon']。
问题2:参数self的实际含义与初始化的必要性
self的实际含义:self就是当前调用方法的实例对象本身。当你执行f.init()时,Python会自动把实例f作为第一个参数传递给init方法,所以方法定义里必须写self来接收这个实例。简单说,self就是“我自己”——调用方法的那个具体实例。- 为什么要初始化:
self是访问实例属性的唯一入口。通过self.xxx赋值,我们能给每个实例绑定独立的属性,让不同实例拥有各自的状态。比如f的blocked是空列表,s的blocked是['spam'],二者互不干扰。如果不用self,定义的就是类属性,所有实例会共享同一个值,就没法实现每个实例有专属黑名单的需求了。
问题3:self.blocked=[]的性质
这就是标准的赋值操作:它把空列表[]赋值给当前实例(self代表的对象)的blocked属性。既不是方法调用,也不是特殊操作,本质就是给实例添加/修改一个属性的值。
内容的提问来源于stack exchange,提问作者zijie geng
相关产品推荐
相关产品推荐

