python语言系统学习(四)
一、面向对象编程。
抽象出一个类对象:
根据类对象创建实例对象。(将某个类对象赋值给某个实例对象)
dog = Dog("拉布拉多","旺财","3","很好")
通过实例对象,访问属性和方法。dog.breed dog.run()
规则:每个单词的首字母大写,其余字母全部小写。
为了在创建实例后对其进行初始化(给实例对象绑定一些属性),需要创建名为__init__( )创建实例对象后就会自动调用这些特殊方法。指的是创建类对象会自动调用所有以双下滑线开头的方法,还是指的是只调用__init( )__方法,这个地方没看明白????。应该是只调用了init( )。
方法和函数的区别:
方法就是定义在类对象中的函数。
1.定义方法时,方法的第一个形参表示调用该方法的实例对象,第一个形参的名称通常是self
2.调用方法的时候,系统自动将调用该方法的实例对象作为实参传递给第一个形参。
如果没有定义__init__,或者定义了__init__,但是没有定义除self以外的形参,那么根据类对象创建实例对象时就不需要传入实参。
如果在类对象在中定义了特殊的方法__init__,那么对于"类名([实参])",会执行两大步:
1.创建实例对象
2.自动调用创建的实例对象的特殊方法__init()__(创建的实例对象会作为实参被自动传递给特殊方法__init__的第一个形参self)
3-5 实例属性
实例属性指的是实例对象所绑定的属性。绑定实例属性的方式有两种:
1.在类对象的内部(方法中)
语法格式: self.属性名 = 属性值
2.在类对象的外部
python是动态语言,所以,在实例对象创建之后,可以对其动态地绑定属性。
语法格式:实例对象.属性名 = 属性值
访问实例属性的方式有两种:
1.在类对象的内部(方法中) 语法格式: self.属性名
2.在类对象的外部 实例对象.属性名
3-6 实例属性下
特殊方法,可以使用__dict__查看某个实例对象绑定的所有属性和方法的字典。给一个对象绑定的实例属性对另一个对象是不起作用的。
3-7 类属性
绑定类属性(给类对象绑定属性)的方式有两种:
1.在类对象的内部(方法外) 语法格式:属性名 = 属性值
2.在类对象的外部: python是动态语言,所以,在类对象创建以后,可以对其动态的绑定属性。 语法格式:类对象.属性名 = 属性值
访问类属性的方式有两种:
1.在类对象的内部(方法中) 语法格式: 类对象.属性名
2.在类对象的外部 类对象.属性名 或:实例对象.属性名
类对象的所有实例对象都有一个指向类对象的指针,所以,类对象的所有实例对象都可以访问类属性。
总结:
3-8和3-12省略
3-10 实例方法
3-12 类方法
类方法必须用装饰器@classmethod进行修饰
在类方法的外部,分别通过类对象和实例对象访问类方法。
实例对象里有指向类对象的指针
3-13 静态方法
在类对象中定义静态方法时,必须使用装饰器@staticmethod进行装饰。静态方法只是一个普通函数。
第一个形参没有特殊的含义和要求。
3-14 访问控制
指的是控制类对象的属性和方法在类对象的外部是否可以直接访问。
如果在类对象的属性或者方法前添加两个下划线__,那么在类对象的外部就不能直接访问该属性或方法了。
仍然可以在类对象的外部动态绑定名为__XXX的属性或方法,这与类对象内部名为__XXX的属性或方法是不同的。
也可以在类对象的内部定义以单下划线开头的属性和方法,表示在类对象的外部可以访问,但是最好不要访问。
3-15 封装
封装 继承 和 多态 是面向对象编程的三大特征。
封装:1、把数据(属性)和行为(方法)包装到类对象中。在类对象的外部调用方法,就无须关心一个方法的实现细节。/2.。
2、在类对象的内部通过访问控制把某些属性和方法隐藏起来,不允许在类对象的外部直接访问。而是在类对象的内部对外提供公开的接口方法。(例如戈getter和setter)
3-16 继承
直接把类定义时,括号里的object替换为需要继承的类即可。继承的主要作用是实现代码复用。
单继承:只有一个父类
多继承:多个父类
子类会继承所有父类的属性和方法。
3-18 重写
当父类中的某个方法被重写之后,通过子类或其实例对象调用,只能调用重写后的方法。若在子类重写的方法中想调用父类的方法,可以用super调用。
3-19 多态
简单的说,就是“具有多种形态”,他指的是:即便不知道一个变量所引用的对象是什么类型,仍然可以通过这个变量调用方法,在运行的过程中根据变量所引用对象的类型,动态的决定调用哪个对象中的方法。
python是一门动态语言,在调用时不会检查参数类型。而java是静态语言。实现多态的条件比动态语言严格很多。
动态语言的多态崇尚“鸭子类型”,即这个对象的行为像鸭子,我们就可以把它看做鸭子类型,即在下面的程序中,我们并不关心f函数中的parent的具体类型,我们只关心parent这个对象中是否有do_sth()这个函数。
3-20 MRO
MRO的全称是Method Resolution Order(方法解析顺序),它指的是一颗类继承树,当调用最底层类对象所对应实例对象的方法时,Python解释器
在类继承树上搜索方法的顺序。对于一颗类继承树,可以调用最底层类对象的方法mro()或访问最底层类对象的特殊属性__mro__,获得这颗类继承树的MRO。
mro函数和属性值的输出结果,代表了这一颗类继承树的搜索顺序。