本章内容
定义类,属性和方法
创建并使用对象
实例方法与自动绑定的self
类与未绑定的方法
类方法与静态方法
@符号及函数装饰器
类变量与实例变量的差别
使用property定义属性
使用特殊成员名实现封装
python的继承
多继承的语法
重写父类的方法
使用未绑定方法调用被重写方法
使用super函数调用父类构造方法
python多态的意义及灵活性
类型检查的相关函数及属性
枚举类的用法
枚举类及其构造器
定义类
在面向对象的程序设计中有2重要概念:类(class)与对象(object),也被称为实例,其中类是某一批对象的抽象,可以把类理解成某种概念:对象才是一个具体存在的实体。语法如下:
class 类名:
执行语句
零个到多个类变量。。。
零个到多个方法。。。
python类所包含的最重要的2个成员就是变量及方法,其中类变量属于类本身,用于定义该类本身所包含的状态数据;而实例变量则属于该类的对象,用于定义对象包含的状态数据;方法则用于定义该类的对象的行为或功能实现。
python是一门动态语言,类变量及对象变量都可以增加减少。在类中定义的方法默认是实例方法,定义实例方法的方法与定义函数的方法基本相同,只是实例方法的第一个参数会被绑定到方法的调用者,因此实例方法至少应该定义一个参数,该参数通常会被命名为self。
在实例中有一个特别的方法,init,这个方法被称为构造方法,构造方法用于构造该类的对象,通过调用构造方法返回该类的对象。
class Person :
'这是学习python定义的一个Person类'
#下面定义了一个类变量
hair = 'black'
def __init__(self,name = 'Charlie',age = 18):
#下面为对象增加2给实例变量
self.name = name
self.age = age
#下面定义一个say方法
def say(self,content):
print(content)
python的类大致有如下作用。
创建对象。
派送子类
对象的产生与使用
创建对象的根本途径是构造方法,调用某个类的构造方法即可创建这个类的对象,python无须使用new调用构造对象。
#调用person类的构造方法,返回一个person对象
#将该person对象赋值给p变量
p = Person()
创建完对象,接下去是使用对象,python的对象大致有如下作用。
操作对象的实例变量
操作对象的方法
#输出p的name,age实例变量
print(p.name,p.age)
访问p的name实例变量,直接为该实例变量赋值。
p.name = '李刚'
#调用p的say()方法,在声明say()方法是定义了2个行参
但是第一个形参是自动绑定的,因此自需要为第二个形参指定一个值
p.say('python语言很简单,学习很容易!')
self.name = name
self.age = age
最后2行代码用传入的name,age参数(这2个参数都有默认值)对self的name,age变量赋值。由于python的第一个self参数是自动绑定的(在构造方法中自动绑定到该构造方法初始化的对象),而这2行代码就是对self的name,age2个变量的赋值,也就是对该构造初始化的对象的name,age变量赋值,即为p对象增加了name,age 2个实例变量。
实例方法和自动绑定self
对于在类体中定义的实例方法,python会自动绑定方法的第一个参数(通常建议为self),第一个参数总算指向调用该方法的对象。根据第一个参数出现位置的不同,第一个参数所绑定的对象略有区别。
在构造方法中引用正在初始化的对象
在普通实例中调用该方法的对象
由于实例第一个self参数会自动绑定,因此程序在调普通实例的时候不需要为第一个参数传值。
self参数最大的作用就是引用当前方法的调用者。
class Dog:
定义一个jump()方法
def Jump(self):
print('正在执行jum方法')
#定义一个run()方法,run()方法需要借助jump()方法
def Run(self):
self.jump()
print('正在执行run方法')
上面代码的run()方法中的self代表该方法的调用者,谁在调用run()方法,那么self就代表谁。因此该方法表示:当一个Dog对象调用run()方法时,run()方法需要依赖它自己的jump()方法。
下节说方法 困了睡觉