一、类是具备相同特征和共同行为的事物的统称;具有抽象性。

二、作用

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'))

执行结果如下: