Python的面向对象常见概念解析
【常见概念简介】
- 类(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 1695645322992 Hello Python 1695645419888 Hello Python 1695645419888 Process 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 2145404866288 Hello Python 2145404963184 Hello 2145404866288 Process finished with exit code 0