AI智能
改变未来

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           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

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » Python的面向对象常见概念解析