19 Python - 面对对象 基础上

    技术2024-06-20  72

    Python 面对对象 基础 上

    文章目录

    Python 面对对象 基础 上一.类和对象二.类中的方法三. init方法四.对象属性和类属性五. 对象属性的增删改查

    一.类和对象

    1.什么是类,什么是对象?

    类就是拥有相同属性和相同功能的对象的集合

    对象就是类的实例

    2.定义类

    语法: class 类名(): 类的说明文档 类的内容(包含属性和方法) 说明: class - 关键字 类名 - 自己命名 要求:不能是关键字 规范:驼峰式命名,并且首字母大写

    3.定义对象(创建对象)

    语法: 类() 说明: 类名 - 是已经定义好的类的类名
    二.类中的方法

    类中的方法分为三种:对象方法、静态方法、类方法

    1.对象方法

    怎么定义:直接定义在类中的函数就是对象方法

    特点:自带参数self(self在通过对象调用的时候不用传参,系统会自动将当前对象传给self)

    怎么调用:用对象去调用(对象.方法名())

    2.类方法

    怎么定义:定义函数前加装饰器 @classmethod

    特点:自带参数cls (cls指向当前类)

    怎么调用:用类调用 ( 类.方法名() )

    3.静态方法

    怎么定义:在定义函数前加装饰器 @staticmethod

    特点:没有默认参数

    怎么调用:用类调用 ( 类.方法名() )

    class Dog: # eat 是对象方法 def eat(self): print('狗啃骨头') # count是类方法 @classmethod def count(cls): print('狗的数量是:100') @staticmethod def func(): print('静态方法') # 创建对象 dog1 = Dog() # 用对象调用对象方法 dog1.eat() # 用类调用类方法 Dog.count() # 用类调用静态方法 Dog.func()

    注意:从本质上讲,类中的所有的方法都可以用对象和类调用,但是不能这样做

    Dog.eat()如果用类来调用对象方法,self就会变成普通的参数,没有存在的价值

    dog1.count()用对象调用类方法的时候cls指向的还是类

    三. init方法

    1.什么是构造方法?

    构造方法:函数名和类名是一样的,用来创建对象的方法就是构造(python中的构造方法在定义类的时候,系统已经自动创建好了)

    2.init方法

    __init__方法又叫初始化方法,用来在创建对象的时候对对象进行初始化操作的.

    当我们通过类创建对象的时候,系统会自动调用__init__方法来对创建出来的对象进行初始化.

    调用构造方法创建对象的时候需不需要参数,需要几个,看被自动调用的__init__.

    class Person: def __init__(self): print('初始化方法') p1 = Person() p2 = Person() # 初始化方法 # 初始化方法

    这里在创建对象的时候就会自动调用__init__方法

    四.对象属性和类属性

    1.对象属性

    对象属性:对象属性会因为对象不同而不一样

    ①对象属性定义在init方法中

    ②以self.属性名 = 值 的方式定义

    ③通过 对象.属性名的方式使用属性

    class Person: def __init__(self, name, age, gender): self.name = name self.age = age self.gender = gender def eat(self): print('{}吃饭'.format(self.name)) p1 = Person('张三', 18, '男') # 创建一个p1 Person对象 print(p1.name) # 获取p1对象的name属性 p1.eat() # 调用p1的eat方法

    2.类属性

    直接定义在类中的变量就是类属性

    类属性的值不会因为对象不同而不一样

    class Dog: num = 100 # 定义狗的数量为100,这里的num就是类属性
    五. 对象属性的增删改查

    python中类的对象的属性支持增删改查

    class Student: def __init__(self, name, age=0, gender='男', score=0): self.name = name self.age = age self.gender = gender self.score = score def __repr__(self): return '<{}>'.format(str(self.__dict__)[1:-1]) stu1 = Student('小明') stu2 = Student('小花')

    1.查(获取属性的值)

    语法: 对象.属性 - 获取对象指定属性相应的值;属性不存在会报错 getattr(对象,属性名) - 获取对象指定属性对应的值,属性不存在会报错 getattr(对象,属性名,默认值) - 获取对象指定属性对应的值,属性不存在返回默认值 print(stu1.name) # 小明 print(stu1.height) # 这里stu1不存在height属性,报错 print(getattr(stu1, 'name')) # 小明 print(getattr(stu1, 'age')) # 0 print(getattr(stu1, 'name1', '小新')) # 小新

    ​ 那么既然我们可以直接用对象.属性名的方式获取对象属性,那么getattr在这里存在的意义到底是什么呢?仅仅是为了让对象属性不存在的时候返回默认值吗?当然不是

    请看下面这个需求,让我们进一步了解getattr存在的意义

    例:根据输入的内容获取对象属性的值(name,age,gender,score)

    value = input('请选择要获取的属性(name,age,gender,score):') # 然后直接 对象.value 来获取吗? 这里会直接报错,因为value是个字符串 # 这里就体现了getattr的进一步用法: print(getattr(stu1, value)) # 这样我们就可以满足我们的需求,更加方便的获取到对象的属性

    2.改、增

    对象.属性 =- 当属性不存在就给对象添加属性,属性存在的时候就修改指定属性的值 setattr(对象,属性名,值)- 当属性不存在就给对象添加属性,属性存在的时候就修改指定属性的值 stu1.name = 'xiaoming' print(stu1) setattr(stu1, 'weight', 80) print(stu1) # 没有这个属性,添加weight这个属性并赋值

    3.删

    del 对象.属性 - 删除对象中指定的属性,没有这个属性会报错 delattr(对象,属性名) - 删除对象中指定的属性,没有这个属性会报错 del stu2.age print(stu2) delattr(stu2, 'gender') print(stu2) # 两种方法都能满足删的需求
    Processed: 0.018, SQL: 9