一、类和对象的定义

类是一种抽象的数据类型,它描述了具有相同属性和方法的对象集合。而对象则是类的实例,它具有类定义的属性和方法。

类(class):是一种自定义的数据类型。

对象(object):是该类型的一个实例。

《先有类后又对象》

类和对象的语法格式

#类的定义语法格式
class ClassName:
    # 类的定义
    pass

#对象的定义语法格式
object_name = ClassName()

class 是关键字, ClassName 是类的名称,冒号后面的缩进的部分是类的主体。可以包含变量、方法、类变量、类方法等

object_name 是对象的名称, ClassName()

二、类的属性和方法

类的属性指类的特征,方法指类的行为。类的属性和方法定义在类的内部,在实例化后可以通过实例对象或者类本身进行访问和调用。

属性和方法都可以分为类属性和实例属性,类属性指属于类的共享属性,实例属性指属于实例的属性。

lass ClassName:
    class_attr = value  # 类属性
    
    def __init__(self, arg1, arg2):  # 初始化方法,也叫构造方法
        self.instance_attr1 = arg1  # 实例属性
        self.instance_attr2 = arg2  # 实例属性
    
    @classmethod
    def class_method(cls, arg):  # 类方法
        # 可以访问类属性,不能访问实例属性
        cls.class_attr = arg
    
    def instance_method(self, arg):  # 实例方法
        # 可以访问实例属性和类属性
        self.instance_attr1 = arg
        ClassName.class_attr = arg
    
    @staticmethod
    def static_method(arg):  # 静态方法
        # 不能访问实例属性和类属性
        print(arg)

类属性

类属性是定义在类中的变量,用于表示所有实例对象共享的数据,可以通过类本身进行访问和修改。

在Python中,类属性可以通过类名或实例对象来访问,也可以通过类方法或静态方法来访问和修改。

类属性的访问方式

类属性的访问方式有以下三种

  1. 通过类名访问
class MyClass:
    class_attr = "我是类属性"

print(MyClass.class_attr)
  1. 通过实例对象访问
class MyClass:
    class_attr = "我是类属性"

obj = MyClass()
print(obj.class_attr)
  1. 通过类方法访问
class MyClass:
    class_attr = "我是类属性"

    @classmethod
    def print_class_attr(cls):
        print(cls.class_attr)

MyClass.print_class_attr()

类属性的修改方式

类属性的修改方式有以下两种:

  1. 通过类名直接修改
class MyClass:
    class_attr = "我是类属性"

MyClass.class_attr = "我是一个新的类属性"
  1. 通过类方法修改
class MyClass:
    class_attr = "I am a class attribute"

    @classmethod
    def change_class_attr(cls, new_value):
        cls.class_attr = new_value

MyClass.change_class_attr("I am a new class attribute")

实例属性

实例属性定义在实例对象中的变量,用于表示每个实例对象的数据,只能通过实例对象进行访问和修改。实例属性可以在类的方法中通过 self

在 Python 中,实例属性通常在类的构造函数 __init__

self

self是一个关键字,在Python中用于表示类的实例对象本身。在类定义中,self作为第一个参数传递给类的方法,用于引用该实例对象本身,以便可以访问其属性和方法。当调用类的方法时,实例对象自动传递给self参数,无需手动传递。在类的方法中,通过self来访问实例属性和调用实例方法。

__init__

__init__ 是 Python 类中的一个特殊方法(也叫构造函数),用于在创建对象时进行初始化操作。当创建一个类的实例时,__init__ 方法会自动被调用,用于对该实例进行初始化操作,比如给实例设置一些属性的初始值。__init__ 方法可以接受任意数量的参数,但是第一个参数必须是 self,表示创建的实例对象本身。其他参数可以根据需要自行添加。

例如,

"""定义了一个 Person 类,其中有一个实例属性 name,在构造函数中初始化。
该类还有一个方法 greet,用于向其他人问好,其中 self.name 表示当前实例对象的名字。"""

class Person:
    def __init__(self, name):
        self.name = name  # 定义实例属性 name,初始化为传入的参数 name

    def greet(self, other_name):
        print(f"你好,{other_name},我是{self.name}。")

# 创建两个 Person 对象,分别设置他们的名字,然后让他们互相问好。
person1 = Person("张三")  # 创建 person1 实例对象,并设置 name 属性为 "张三"
person2 = Person("李四")  # 创建 person2 实例对象,并设置 name 属性为 "李四"

person1.greet("李四")  #输出结果:你好,李四,我是张三。
person2.greet("张三")  #输出结果:你好,张三,我是李四。

类方法

类方法指属于类的方法,可以通过类本身进行调用,但是不能访问实例属性,只能访问类属性。

通常使用装饰器@classmethod来定义类方法。类方法的第一个参数是类本身,通常被命名为cls。

类方法可以用于访问和修改类属性,或执行只与类有关的操作。

class MyClass:
    class_attr = "I am a class attribute"
    
    @classmethod
    def class_method(cls):
        print(cls.class_attr)

实例方法

实例方法指属于实例对象的方法,只能通过实例对象进行调用,可以访问实例属性和类属性。

在定义实例方法时,第一个参数通常是 self,它表示实例本身。

#实例方法的语法格式
class MyClass:
    def instance_method(self, arg1, arg2, ...):
        # 方法体

"""self 表示实例本身,arg1、arg2 等参数为方法的输入参数,可以根据需要添加或省略。"""


"""调用实例方法时,通常不需要传入 self 参数,Python 会自动将实例对象传递给该参数。"""
my_obj = MyClass()
my_obj.instance_method(arg1, arg2, ...)
"""调用时,Python 会自动将 my_obj 传递给 self 参数,
同时将 arg1、arg2 等参数传递给 arg1、arg2 等方法参数。"""

静态方法

静态方法是一种不需要实例化类就能够被调用的方法。与实例方法和类方法不同,静态方法没有访问实例或类的参数。

在 Python 中,可以使用 @staticmethod

class MyClass:
    @staticmethod
    def multiply(a, b):
        return a * b

print(MyClass.multiply(3, 4))  # 输出 12

三、类和继承

类和继承是面向对象编程的两个核心概念,类用来封装数据和方法,继承则允许一个类继承另一个类的特性。

类的继承可以帮助我们避免重复代码的编写,也可以让我们创建更加抽象和通用的类,同时也可以方便地实现多态。

在 Python 中,通过在定义类时指定基类(父类)来实现继承。子类会自动拥有父类的属性和方法,并且可以添加新的属性和方法或者修改继承自父类的属性和方法。

"""假设我们要写一个学生类(Student),它有姓名(name)、学号(id)、年龄(age)等属性,
以及查看个人信息(get_info)、修改个人信息(update_info)等方法。"""

#定义这个类
class Student:
    def __init__(self, name, id, age):
        self.name = name
        self.id = id
        self.age = age

    def get_info(self):
        print(f"姓名:{self.name},学号:{self.id},年龄:{self.age}")

    def update_info(self, name, id, age):
        self.name = name
        self.id = id
        self.age = age
        print("信息已更新!")

#创建一个学生实例来使用这个类
# 创建一个学生实例
stu = Student("张三", "1001", 18)

# 查看学生信息
stu.get_info()  # 姓名:张三,学号:1001,年龄:18

# 修改学生信息
stu.update_info("李四", "1002", 19)

# 再次查看学生信息
stu.get_info()  # 姓名:李四,学号:1002,年龄:19

四、多重继承

多重继承是指一个类可以从多个父类中继承属性和方法。在 Python 中,可以通过在类定义中指定多个父类来实现多重继承。

多重继承的语法为:class 子类名(父类1, 父类2, …)。

"""
假设我们有三个类:Person、Father和Mother。Father和Mother都继承自Person类。
现在我们要创建一个Child类,它同时继承了Father和Mother类。
"""
class Person:
    def __init__(self, name):
        self.name = name

    def greet(self):
        print(f"Hello, my name is {self.name}")


class Father(Person):
    def __init__(self, name, age):
        super().__init__(name)
        self.age = age

    def sing(self):
        print("I'm singing a song")


class Mother(Person):
    def __init__(self, name, hobby):
        super().__init__(name)
        self.hobby = hobby

    def dance(self):
        print("I'm dancing")


class Child(Father, Mother):
    def __init__(self, name, age, hobby):
        Father.__init__(self, name, age)
        Mother.__init__(self, name, hobby)

    def play(self):
        print("I'm playing with my friends")

在这个例子中,Child类同时继承了Father和Mother类,因此它有Father和Mother类中的所有方法和属性。注意,在Child类的构造函数中,我们分别调用了Father和Mother类的构造函数,以便将必要的属性传递给它们。

五、练习题

定义一个登录的测试用例类LoginCase,每一个实例对象都是一个登陆测试用例属性:用例名称预期结果实际结果(初始化时不确定值哦)

方法:运行用例说明:有2个参数:用户名和密码,能够登录成功的用户名:py58.密码:666666.通过用户名和密码正确与否来判断,是否登录成功,并返回实际结果,

ps:可以在用例内部考虑处理不符合的情况哦:密码长度不是6位/密码不正确/用户名不正确等。。

获取用例比对结果(比对预期结果和实际结果是否相等,并输出成功or失败)实例化2个测试用例,并运行用例(调用方法),呈现用例结果(调用方法)可以向自己发送文件或转发消息

class LoginCase:
    def __init__(self, name, expected,actual):
        self.name = name
        self.expected = expected
        self.actual = None

    def run(self, username, passwd):
        if len(passwd) != 6:
            self.actual = "密码长度不是6位"
        elif username != "py58" :
            self.actual = "用户名不正确"
        elif passwd != "666666":
            self.actual= "密码不正确"
        elif username == "py58" and passwd == "666666":
            self.actual="登录成功"
        else:
            print("异常")
        return self.actual==self.expected



case={"name":"Test Case 1",
      "expected":"登录成功",
      "username":"py58",
      "passwd":"666666"}


a=LoginCase(case["name"],case["expected"],None)
print(a.run(case["username"],case["passwd"]))