一、类是具备相同特征和共同行为的事物的统称;具有抽象性。
二、作用
1、类作用:用来创建对象
2、实例作用:用来模拟现实生活的事物,类的某个实体/成员。
三、创建
1、创建类(变量表示特征,函数表示行为),类名命名规则是大驼峰格式
class 类名:
变量
函数
2、创建对象,即对象实例化
格式:类名() 如:dog = Dog()
四、构造函数
1、作用:创建对象时会被调用类当中的__init__初始化函数,用来初始化对象数据
2、__init__函数没有返回值,只能返回None
3、格式(可无参、有参):
def __init__(self,参数列表):
语句
4、当类中无定义init函数,系统会自动生成一个无参构造函数
五、self
1、在类中定义方法,一般会在方法中设置第一个参数self
self表示对象,self表示在对象的生产过程中,代表即将出生的对象的一个标记。self是在类定义里面使用的,类外面是没有self
class Car: wheel = '4轮' def __init__(self,color,logo): self.color = color self.logo = logo bmw = Car(color='白色',logo='BMW') print(f'{bmw.wheel},喷{bmw.color},印{bmw.logo}')
执行结果如下:
六、属性1、类属性:在类定义作用域当中定义的变量;
2、实例属性:类当中某个成员具备的特征。
类属性:
1、定义(增):类名.类属性 = value、在类中直接定义,类属性
2、访问(查):类名.类属性、对象.类属性(对象先查自己的没有再查类里的)
3、修改(改):类名.类属性 = new_value
4、删除(删):del 类名.类属性 del只删除直系属性
5、类的所有属性:类.__dict__ 可查看该类的所有属性,只读,不可通过__dict__修改类属性
实例属性:
1、定义(增):直接通过对象动态添加 实例.属性 = value、通过类的初始化方法__init__
2、访问(查):类内访问 self.属性、类外访问 实例.属性
3、修改(改):实例.属性 = new_value(后面加=是修改赋值,不加=则是访问查看)
4、删除(删):del 实例.属性
5、实例的所有属性:实例.__dict__ 可查看该实例的所有属性,可通过__dict__修改实例属性
6、不同实例之间不能互相访问对方的属性
获取属性
1、在类的外面可获取类属性,类属性是局部,不能在类外面直接获取,通过类.属性获取;在类的里面可直接获取类属性
3、类不能访问实例属性;实例可访问类属性,但不能修改、删除、增加
4、类修改某属性后,类/实例属性都会变;修改实例的属性,类属性不变,实例属性变
七、__slots__
表示该类的对象只能添加age属性 __slots__ = ['属性'],若设置其他属性报错
class Animal: __slots__ = ['age'] def info(self,name,age): self.name = '胖胖' self.age = 2 dog = Animal() print(dog.name,dog.age)
执行结果如下:
八、方法1、在类的作用域里面定义的函数就叫做方法,特殊的函数。__init__是构造函数,初始化函数。把带有self固定参数的方法叫做实例方法,属于实例的行为,有类方法、实例方法、静态方法
类方法
1、在类内定义,默认第一个参数接收一个类cls,用@classmethod声明
2、类和实例都可调用
实例方法
1、在类内定义,默认第一个参数接收一个实例self,不需要声明
2、只能由实例调用,类不能调用。 实例.方法名称()
3、当方法有参数时,遵循和普通函数一样的规则。该传参还是要传参,什么逻辑还是什么逻辑
4、在类里面,一个实例方法调用另一个方法用 self.实例方法名()
5、各方法中,使用实例的属性,用self.属性获取
静态方法(一般不用)
1、在类内定义,不需要有默认传参,需要用@staticmethod声明
2、和类、实例没有任何直接的关联,不用self.属性、其他实例方法、cls.属性、类方法
3、调用静态参数 类.静态函数() 或 实例.静态函数()
4、静态方法跟普通函数没啥区别,放在类外就是普通函数,直接 函数名称()调用;放在类内就是静态方法,用 类.静态函数() 或 实例.静态函数() 调用
class Car: def s_start(self): return '实例方法' @classmethod def c_statr(cls): return '类方法' @staticmethod def j_start(): return '静态方法' bmw = Car() print(bmw.s_start(),Car.c_statr(),bmw.j_start(),Car.j_start())
执行结果如下:
九、继承1、一个新类从已有类里获得所有变量和函数(类内的可继承,类外的不可继承),自己有对应的属性和方法优先用自己的,若没有就调用上一层的,若上一层的没有就调用上上层的,一层一层网上找
2、格式:
class 子类名(父类名):
变量
方法(函数)
class Animal: name = '胖胖' age = 2 def sleep(self): return '睡觉觉!' class Cat(Animal): def showInfo(self): return f'{self.name},{self.age},{self.sleep()}' cat = Cat() print(cat.showInfo())
执行结果如下:
3、继承方式
可直接继承、可自己重写、也可先将父类的拿过来,在自己搞一些自己的
直接继承,在子类中不用再定义可直接获取
方法重写
子类中的重写方法覆盖父类中相同声明(相同函数名)的方法
class Car: def start(self): return '可驱动!' class Bmw(Car): def start(self): return '驱动的更快666!' bmw = Bmw() print(bmw.start())
执行结果:
引用父类的再搞一些自己的 super()函数 super().父类方法()
class Car: def start(self): print('可驱动') class Bmw(Car): def new_start(self): super().start() return '驱动更666' bmw = Bmw() print(bmw.new_start())
执行结果如下:
4、多重继承
多重继承,多个类用逗号隔开即可
class Inphone(SmartPhone,MusicPlayer)
十、属性扩展
设置属性
1、可以直接 类.属性 = value
2、setattr()设置 setattr(类名,'属性名称','属性值'),必须放在类外
class Car: def s_start(self): return '可驱动' setattr(Car, 'wheel', '4轮') print(Car.wheel)
获取属性
1、可直接 类.属性
2、getattr()获取 getattr(类名,str) 属性名称可作为str传进去 getattr(类名,‘属性名’),可自己输入属性,动态获取 getattr('类名',input('请输入:')) 必须放在类外
class Car: wheel = '4轮' color = '白色' def s_start(self): return '可驱动' print(getattr(Car, 'color'))
执行结果如下: