day15-python面向对象编程

一 类中的方法

定义类就是描述清楚这个类拥有哪些相同的功能和属性的集合。
类中的方法就是对类相同功能的描述

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('新康睡觉')

    # =============类方法===============
    @classmethod
    def show_num(cls, num):
        print(f'人类数量:{num}亿')

    # =============静态方法===============
    @staticmethod
    def 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 = 30
    def __init__(self):
        # score、name和age就是对象属性
        self.score = 0
        self.name = '旧康'
        self.age = 18
print(Student.num)

stu1 = Student()
print(stu1.name, stu1.age, stu1.score)


class Circle:
    pi = 3.1415926
    def __init__(self, r):
        self.radius = r

circle1 = Circle(10)
print(circle1.radius)


class Person:
    def __init__(self, name: str, age: int, sex='女'):
        self.name = name
        self.age = age
        self.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 = breed
        self.sex = sex
        self.age = age
        self.name = name


dog1 = 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’

你可能感兴趣的:(day15-python面向对象编程)