【常见概念简介】
- 类(class)—— 用来描述某些具有相同属性和方法的对象的集合。格式如下
class test():class_variable...
def f(self,*arg,**args):statement... - 类方法 ———— 类中定义的函数(跟普通函数的唯一区别就是:类方法的第一个参数必须是实例/对象自己,习惯上常用self表示(当然,如果你看不顺眼也可以使用其他字符串代替,使用self只是pythonic的习惯而已)。见上方示例)
- 类变量 ———— 定义在类中、类方法外,在该类的所有实例间共享。一般情况下建议使用“class.variable”形式访问。
- 实例变量 ——— 定义在类方法中,且以“self.variable”形式出现。各实例间独享、互不影响。
- 继承 ————— 一个派生类继承基类的变量和方法,基类可以是单个类也可以有多个类(多个类继承时,按照继承顺序从左到右继承(多个类有相同的变量/方法时以左侧最先匹配到的父类为准))
- 重载 ————— 又叫“方法重写”:当继承的父类的方法不能完全满足子类需要的时候,一般会在子类中重新定义一个同名方法。
【典型问题剖析】
类变量 vs 实例变量
\'\'\'从代码的可读性、可维护性、易理解等角度出发,建议:类变量————使用“Class.Variable”形式读取、修改实例变量————使用“instance.Variable”形式读取、修改否则,代码结构不易维护、执行结果不易理解\'\'\'
1)按上述建议访问类变量,代码逻辑清晰、执行结果一目了然(类变量的结果跟实例对象的结果相同):
代码:
class Person:name = \'Hello \'print(name,\'\\t\'*2,id(name))def changeName(self): Person.name += \'Python\' #按照建议的规范访问并修改类变量,结果:二种方式读取到的内容一致,没有歧义print(self.name,\'\\t\',id(self.name))print(Person.name,\'\\t\',id(Person.name))p = Person()p.changeName()
执行结果:
Hello 1695645322992Hello Python 1695645419888Hello Python 1695645419888Process finished with exit code 0
2)不遵守上述规范,代码不一定会报错,但执行结果不可控,不利于代码的维护和逻辑理解(类变量的结果跟实例对象的结果不同):
代码:
class Person:name = \'Hello \'print(name,\'\\t\'*2,id(name))def changeName(self): self.name += \'Python\' #不按照建议的规范访问并修改类变量,结果:二种方式读取到的内容不一致,容易产生歧义print(self.name,\'\\t\',id(self.name))print(Person.name,\'\\t\',id(Person.name))p = Person()p.changeName()
执行结果:
Hello 2145404866288Hello Python 2145404963184Hello 2145404866288Process finished with exit code 0