一 类中的方法
定义类就是描述清楚这个类拥有哪些相同的功能和属性的集合。
类中的方法就是对类相同功能的描述
1.1 什么是方法
方法就是定义在类中的函数,分为三类:对象方法、类方法、静态方法
1.1.1 三个方法
① 对象方法
怎么定义:直接定义在类中的函数就是对象方法
特点:自带参数self,如果使用对象去调用对象方法,对象方法中self不用传参,系统会自动将当前对象传给self
self指向当前对象
怎么调用:对象.方法()
创建对象:
对象名 = 类名()
② 类方法
怎么定义:在定义函数前加 @classmethod
特点:自带参数cls,如果使用类去调用类方法,方法中的cls不用传参,系统会自动将当前类传给cls。
cls指向当前类
怎么调用:类.方法()
③ 静态方法
怎么定义:在定义函数前加 @staticmethod
特点:没有默认参数
怎么调用:类.方法()
注意:从语法的角度来看,不管是对象方法、类方法和静态方法都可以使用类和对象来调用(但是实际开发不要这样做)
但不合理
class Person:# ===========对象方法===============# eat就是对象方法def eat(self, food='米饭'):print('新康吃饭', food)# sleep也是对象方法def sleep(self):print('新康睡觉')# =============类方法===============@classmethoddef show_num(cls, num):print(f'人类数量:{num}亿')# =============静态方法===============@staticmethoddef show_message():print(f'新康老是破坏环境')p1 = Person()
p2 = Person()p1.eat()
p2.eat('狗屎')
p1.sleep()Person.show_num(23)Person.show_message()
二 构造函数和init
2.1 什么是构造函数 - 函数命和类名同名的用来创建对象的函数/方法
a. 函数命和类名同名 b. 功能是用来创建对象的
python中,当我们在定义类的时候,系统会自动创建这个类的构造函数。在这个构造方法中会自动调用
__new__方法来创建对象,并且用这个创建好的对象来调用__init__对对象进行初始化草所,最后才将对象返回。
2.2 __init__方法
__init__是每个类中都有的一个特殊对象方法,是魔法方法(会被自动调用
当调用构造方法创建对象的时候,系统会自动调用这个类中 init 方法
在类中添加__init__方法,只需要保证方法名是__init__, 方法是对象方法。
调用构造方法创建对象的时候,这个构造方法需不需要参数,需要几个参数,看类中的__init__方法除了self以外需不需要参数,
需要几个参数
class Dog():def __init__(self, x):print('INIT方法')print(x)
""" def Dog():dog = Dog.__new__()dog.__init__()return dog """
dog1 = Dog(10)
三 类中的属性
3.1 什么是属性
我们通过类中的属性来保存类相关的数据
3.2 属性的分类
类中的属性分为两种:类属性和对象属性
① 类属性(类的字段)
a. 定义:直接定义在类中的变量就是类属性
b. 使用:类.属性
c. 什么时候用:属性值不会因为对象不同而不一样的时候,就使用类属性
② 对象属性
a. 定义:定义在__init__方法中,以self.属性 = 值 的形式进行定义(属性自己命名,要求和规范同变量名)
b. 使用:对象.属性
c. 什么时候用:属性值会因为对象不同而不一样的时候,就使用du对象属性
class Student():# num就是一个类属性num = 30def __init__(self):# score、name和age就是对象属性self.score = 0self.name = '旧康'self.age = 18
print(Student.num)stu1 = Student()
print(stu1.name, stu1.age, stu1.score)class Circle:pi = 3.1415926def __init__(self, r):self.radius = rcircle1 = Circle(10)
print(circle1.radius)class Person:def __init__(self, name: str, age: int, sex='女'):self.name = nameself.age = ageself.sex =sex# 重写__repr__方法可以自定义对象的打印格式:这个方法的返回值就是打印结果(返回值必须是字符串)def __repr__(self):# 打印谁,self就只想谁return f'name:{self.name}, age:{self.age}, sex:{self.sex}'p1 = Person('阿康', 10, '女')
print(p1)p2 = Person(name='小小', age=18, sex='不明')
print(p2)
四 对象属性的增删改查
4.1 对象属性
python类中对象的属性支持增、删、改、查
class Dog():def __init__(self, name, breed='土狗', sex='母构', age=1):self.breed = breedself.sex = sexself.age = ageself.name = namedog1 = Dog('大黄', sex='公狗')
dog2 = Dog('宝贝', '哈士奇', age=3)
① 查 - 获取属性值
a. 对象.属性 - 获取对象指定的属性值(属性不存在,会报错)
b. getattr(对象, 属性名) - 获取对象指定的属性值(属性不存在,会报错)(可以根据变量的值动态获取指定属性的值)
c. getattr(对象, 属性名, 默认值) - 获取对象指定的属性值(属性不存在,不会报错,返回默认值)
print(dog1.name)
values = input('请输入属性值:')
print(getattr(dog1, values))
② 增、改
a. 对象.属性 = 值 - 如果属性存在就修改对象属性的值;如果不存在就是添加属性
b. setattr(对象, 属性名, 值) - 如果属性存在就是修改对象属性的值;如果属性本身不存在就是添加属性
③ 删
a. del 对象.属性 - 删除对象的指定属性
b. delattr(对象, 属性名) - 删除对象的指定属性
del dog1.age
print(dog1.age) # AttributeError: ‘Dog’ object has no attribute ‘age’