9.1面向对象
一个模块里可以用多个类么?
可以哦如何定义一个类
class Student():
# 类变量,在python中称为数据成员
name=""
age=0
# 类方法
def print_file(self):
pass类建议使用StudentType的方式命名,而不是像变量一样使用student_type的方式命名
类的使用
形式一:在同一个模块中使用类,直接先创建一个对象,也称实例化
# Student类实例化 variable1=Student() # 调用类下的方法 variable1.print_file()形式二:在另一个模块中调用类,需要先引用,再实例化
# c1是Student类所在的模块名 from c1 import Student student=Student() Student.print_file()
一个类继承另一个类
module1.py
modele2.py
如何定义一个方法
类的构造函数
注意构造函数的调用是自动运行的,当实例化时python会自动调用构造函数
构造函数可以显式调用么?
带入参的的构造函数
实例方法
注意:第一个参数不一定必须命名为self,这个参数命名可自定义,但推荐使用self
方法调用时,不需要为self赋值,python将自动把对象实例赋值给self
方法的调用
方式一:类内调用方法:self.方法名()
方式二:类外调用方法:对象.方法名()
类方法
第一个参数不一定必须命名为cls,这个参数命名可自定义,但推荐使用cls。
方法调用时,不需要为cls赋值,python将自动把对象实例赋值给cls
类方法的调用
方式一:类名.类方法名
方式二:对象.类方法名,不推荐这样使用,因为一个对象调用类方法总显得奇怪
静态方法
静态方法不像其他方法一样需要self或cls参数,静态方法更像是函数。静态方法比较鸡肋,一般不是特别建议使用静态方法,不过如果你确定一个方法,它和类与对象关系都不大时,可以使用静态方法
静态方法调用
方式一:类名.静态方法名
方式二:对象.静态方法名
私有方法
注意:当方法名前添加双下划线后,方法会声明为私有方法,但当方法名前后都添加双下划线后,将不再私有。python的内置方法常使用这种前后都添加双下划线的方式。
访问数据成员的方式
类变量的访问
方式一:在该类的实例方法内访问类变量:self.__class__.name
方式二:在该类的类方法内访问类变量:cls.类方法名
方式三:在该类的静态方法内访问类变量:类名.类方法名
方式四:在该类外访问该类变量:类名.类变量名
实例变量的声明
方式一:类内声明
方式二:动态声明,类内没有实例变量,在对象中动态声明
实例变量的访问
方式一:通过对象访问数据成员,这里的数据成员称为实例变量
查看对象下的所有实例变量
在该类的类方法和静态方法内无法访问实例变量,即如下代码将报错
私有成员
注意:当成员名前添加双下划线后,成员会声明为私有变量,但当成员名前后都添加双下划线后,将不再私有。python的内置成员变量常使用这种前后都添加双下划线的方式。
python的实现私有的方式比较low,只是将私用成员的成员名转换为“类名_私有成员名”的形式进行存储,从而当时尝试通过私有成员名访问私有成员时找不到私有成员,存储形式如下:
既然如此,那有小伙伴问:“那是不是通过 类名_私有成员名 的方式就可以访问到私有成员?”,答案是可以的,但我们不推荐这样使用。既然一个变量已经声明为私有了,我们就不应该尝试去访问它。
对象
创建对象
通过print(id(student1))可以查看对象地址
赋予对象独属的特征
注意:使用对象的实例变量时,若对象未对该变量赋值,python将去寻找类中对应的类变量;若类中也未对该变量赋值,python将尝试去类的父类中寻找。
类继承
一个类继承另一个类
module1.py
modele2.py
注意:子类将继承父类的类变量,构造函数、实例变量、实例方法
子类调用父类构造函数
方式一:
方式二:
注意:其实Human. init()的第一个参数不一定要传入self,而可以传入任意对象都是可以的,如:‘ ‘
以上方法虽然可行,但不推荐使用。一个类在调用实例方法真的是一种很奇怪的方式。
方法重写:子类方法允许与父类方法重名
Last updated
Was this helpful?