面向对象基础
将属性、方法打包到一个对象上,就是面向对象编程
类与对象
类:一组具备相同属性、方法的模板
对象是类的实例对象,可参考前端JS进阶回顾1中实例化的描述
1 2 3 4 5 6 7
| class Person: pass p1=Person() p1.name="Jack" p1.sex='male' print(p1.__dict__)
|
上述是动态的为对象增加属性,但不推荐使用
1 2 3 4 5
| class Person: def __init__(self,name,sex): self.name=name self.sex=sex p1=Person('Jack','male')
|
上述使用初始化方法__init__为对象设置属性,当实例化时自动调用__init__方法,self指向当前对象(在js中就是this)
实例方法
为类的实例对象增加方法
1 2 3 4 5 6 7 8 9 10 11
| class Person: def __init__(self,name,sex): self.name=name self.sex=sex def work(self): print(f'{self.name} are working') def relax(self): print(f'{self.name} are relaxed') p1=Person('Jack','male') p1.work() p1.relax()
|
魔法方法
py提供的用于定义类的特殊行为,以__开头,如__init__
这些方法不需要手动调用,而是在合适的时机自动调用(类似前端的生命周期)
1 2 3 4 5 6 7 8 9 10
| __init__
__str__
__eq__
__lt__、__le__、__gt__、__ge__
__del__
|
实例属性与类属性
实例属性是属于具体对象的属性(对象的特有属性)
类属性是属于类本身的属性,所有实例共享的
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| class Person: leg=2 def __init__(self,name,sex): self.name=name self.sex=sex if name=='Jack': self.leg=1 def work(self): print(f'{self.name} are working') def relax(self): print(f'{self.name} are relaxed') p1=Person('Jack','male') p2=Person('Mary','male') print(p1.leg,p2.leg)
|
通过实例查找属性时,优先查找实例属性,不存在时再查找类属性
类方法与静态方法
类方法需要用@classmethod来表示为类方法,方法的第一个参数必须为类对象,习惯以cls作为形参。
静态方法使用@staticmethod标识
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| class Person: water=False @classmethod def drink(cls): cls.water=True @staticmethod def talk(): print('I am Person') def run(self): pass if __name__ == '__main__': P1 = Person() P1.drink() print(P1.water) print(Person.water) """ True True """
|
异常
程序运行中出现的错误会中断执行流程
NameError、TypeError、IndexError、KeyError、ValueError等等
捕获异常
1 2 3 4 5 6 7
| try: ... except [异常类型 as 变量名]: ... [finally: ...]
|