Python基础08_类和对象(上)

时间:2024-10-18 15:20:25

目录

一、面向对象编程

二、类和对象

1、类的定义

2、实例化对象

三、属性和方法

1、属性

2、方法

3、类属性

4、类方法

5、静态方法

四、继承


一、面向对象编程


什么是对象:

  • 对象是指现实中的物体或实体

什么是面向对象:

  • 把一切看成对象(实例),用各种对象之间的关系来描述事务。

对象都有什么特征:

  • 对象有很多属性(名词)

    • 姓名, 年龄, 性别,

  • 对象有很多行为(动作,动词)

    • 学习,吃饭,睡觉,踢球, 工作

什么是类:

  • 拥有相同属性和行为的对象分为一组,即为一个类

  • 类是用来描述对象的工具,用类可以创建此类的对象(实例)

二、类和对象


1、类的定义

通过class关键字定义类

'''
class 类名 (继承列表):
	实例属性(类内的变量) 定义
    实例方法(类内的函数method) 定义
    类变量(class variable) 定义
    类方法(@classmethod) 定义
    静态方法(@staticmethod) 定义

'''

说明

  • 类名必须为标识符(与变量的命名相同,建议首字母大写)

  • 类名实质上就是变量,它绑定一个类

# 定义Dog类
class Dog:
    name = '小黑'
    def eat(self):
        print('吃东西')

2、实例化对象

"""
变量 = 类名([参数])
"""

说明

变量存储的是实例化后的对象地址。

类名后面的参数按照构造方法的形参传递

  • 对象是类的实例,具有类定义的属性和方法。

  • 通过调用类的构造函数来创建对象。

  • 每个对象都有自己的状态,但共享相同的方法定义。

# 实例化
dog01 = Dog()
print(dog01.name)  # 小黑
dog01.eat()  # 吃东西
print(dog01)  # <__main__.Dog object at 0x000001DEC8DB6FD0>

dog02 = Dog()
print(dog02.name)
dog02.eat()
print(dog02)  # <__main__.Dog object at 0x000001DEC8DB6FA0>

3、 self参数

Dog类中:

def eat(self):
    # 类实例化后,self即代表着实例(对象)本身
    # self是类方法的第一个参数,用于引用对象本身
    print('吃东西')

类实例化后,self即代表着实例(对象)本身。

三、属性和方法


1、属性

每个实例可以有自己的变量,称为实例变量(也叫属性)

"""
实例.属性名
"""

 赋值规则

  • 首次为属性赋值则创建此属性.

  • 再次为属性赋值则改变属性的绑定关系.

作用

  • 记录每个对象自身的数据

class Dog:
   def eat(self, food):
       print(self.color, '的', self.kinds, '正在吃', food)
# 创建一个实例
dog1 = Dog()
dog1.kinds = "京巴"  # 添加属性
dog1.color = "白色"
dog1.color = "黄色"  # 改变属性的绑定关系
print(dog1.color, '的', dog1.kinds)  # 黄色 的 京巴

 实例方法和实例属性结合使用:

class Dog:
    def eat(self, food):
        print(self.color, '的',
              self.kinds, '正在吃', food)

# 创建第一个对象
dog1 = Dog()
dog1.kinds = '京巴'  # 添加属性kinds
dog1.color = '白色'  # 添加属性color
dog1.eat("骨头")  # 白色 的 京巴 正在吃 骨头

dog2 = Dog()
dog2.kinds = '牧羊犬'
dog2.color = '灰色'
dog2.eat('包子')  # 灰色 的 牧羊犬 正在吃 包子

2、方法

# 实例方法
"""
def name(self,参数):
"""

说明

  • 实例方法的实质是函数,是定义在类内的函数

  • 实例方法至少有一个形参,第一个形参绑定调用这个方法的实例,一般命名为"self"

  • 实例方法名是类属性

调用方法

  • 通过实例访问:实例.实例方法名(调用传参)
  • 通过类名访问:类名.实例方法名(实例, 调用传参)
class Myclass:
    class_att = 0  # 类属性

    def __init__(self, name):
        self.name = name  # 实例属性

    @classmethod
    def modify_class(cls, num):
        cls.class_att = num
        print(f"类属性修改为:{cls.class_att}")

myclass01 = Myclass("moonquake")
# 访问类方法
myclass01.modify_class(100)  # 通过实例访问  # 类属性修改为:100
Myclass.modify_class(200)  # 通过类名访问  # 类属性修改为:200

3、类属性

类属性是类的属性,此属性属于类,不属于此类的实例

说明

  • 可以通过该类直接访问

  • 可以通过类的实例直接访问

# 访问类属性
print(myclass01.class_att)  # 通过实例访问  # 200
print(Myclass.class_att)  # 通过类名访问  # 200

4、类方法

类方法是用于描述类的行为的方法,类方法属于类,不属于该类创建的对象

说明

  • 类方法需要使用@classmethod装饰器定义

  • 类方法至少有一个形参,第一个形参用于绑定类,约定写为'cls'

  • 类和该类的实例都可以调用类方法

  • 类方法不能访问此类创建的对象的实例属性

class Myclass:
    class_att = 0  # 类属性

    def __init__(self, name):
        self.name = name  # 实例属性

    # 类方法
    @classmethod
    def modify_class(cls, num):
        cls.class_att = num
        print(f"类属性修改为:{cls.class_att}")

myclass01 = Myclass("moonquake")
# 访问类方法
myclass01.modify_class(100)  # 通过实例访问  # 类属性修改为:100
Myclass.modify_class(200)  # 通过类名访问  # 类属性修改为:200

cls参数

在Python中,cls 是一个约定俗成的名称,用于表示类本身。在类方法(使用 @classmethod 装饰的方法)中,cls 作为第一个参数传递给方法。这使得类方法可以访问和修改类属性以及调用其他类方法,而不需要引用具体的实例。

cls 作用

  • 访问类属性:类方法可以通过 cls 访问和修改类属性。

  • 调用类方法:类方法可以通过 cls 调用其他类方法。

  • 创建类实例:类方法可以使用 cls 来创建类的实例。

5、静态方法

静态方法是定义在类的内部函数,此函数的作用域是类的内部

说明

  • 静态方法需要使用@staticmethod装饰器定义

  • 静态方法与普通函数定义相同,不需要传入self实例参数和cls类参数

  • 静态方法只能凭借该类或类创建的实例调用

  • 静态方法可以访问类属性但是不能访问实例属性(强行访问: 类名.实例属性)

class Myclass:
    count = 0  # 类属性

    def __init__(self, name):
        # 实例属性
        self.name = name

    # 静态函数
    @staticmethod
    def myadd(x,y):
        print(Myclass.count)  # 静态方法可以访问类属性
        # print(self.name)  # 但是不能访问实例属性
        return x+y

my01 = Myclass("坤")
# 实例对象调用
print(my01.myadd(2,3))  # 0 5
# 类名调用
print(Myclass.myadd(3,4))  # 0 7

四、继承


继承是从已有的类中派生出新的类,新类具有原类的数据属性和行为,并能扩展新的能力。

目的

  • 延续旧的类的功能

作用

  • 用继承派生机制,可以将一些共有功能加在基类中。实现代码的共享。

  • 在不改变基类的代码的基础上改变原有类的功能

名词

  • 基类(base class)/超类(super class)/父类(father class)

  • 派生类(derived class)/子类(child class)

类型 

单继承、多继承

覆盖override

子类的方法跟父类的方法同名时 会覆盖父类的方法

# 父类 基类
class Human:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def say(self, what):
        print(f"说了{what}")

    def walk(self, step):
        print(f"走了{step}")

class Teacher:
    def teach(self):
        print("正在摸鱼")

# 子类 多继承
class Student(Human, Teacher):
    def __init__(self, score, name, age):
        # 调用父类的构造函数
        Human.__init__(self, name, age)
        self.score = score

    # 子类的方法跟父类的方法同名 会覆盖父类的方法
    def say(self):
        print(f"我{self.name}今年{self.age}")

    def study(self, hour):
        print(f"学习了{hour}")


human01 = Human("小明",4)
student01 = Student(60,"小红","18")
human01.say("好吧")  # 说了好吧
# 继承方法
student01.say()  # 我小红今年18
student01.teach()  # 正在摸鱼