Python —— 类和对象

1、类

1、认识类

1、定义类:  class  类名(遵循驼峰命名),类可以从字面意思上了解,就是一类事物的统称,植物、水果、大海、大山等,都是一类事物,例如:class Car:定义一个车类;class Fruit:定义一个水果类

2、类的特性:

1、类中会定义这个类共有的特点和状态,可以理解为这类事物的属性和方法

2、类可以调用自己的属性,但是 不可调用它对象的属性

写一个简单的类了解一下:

# 定义一个车类
class Car:
    # 定义类的2个属性
    wheel = "车轮子"
    isNewEnergy = True

2、类中的init方法

1、概述:

1、init方法在类定义的时候,就会给对象定义实例属性

2、初始化对象过程:函数的名字是固定的不能变

2、实例化对象的过程,会调用init方法

4、实例属性都会在init函数里去定义,基本上不会在外面去定义

5、init方法没有返回值,不能写 return,写了默认是None

6、类的方法可以调用了init函数中的属性,需要加 self,例如:self.属性名

如下举例:

# 定义类
class Car:
    # 定义类的属性
    wheel = "四个轮子"
    engine = True
    # 定义init方法,并且在init中定义了2个对象的属性,cl和lg
    def __init__(self, cl, lo):
        self.color = cl
        self.logo = lo
        print(f"正在生成一辆车···")
        print(f"车的颜色是{self.color}的,车的品牌是{self.logo}")


# 初始化的时候,会调用init函数,一定要写init函数里面的形参,并且个数要对上
my_car = Car("黑色","奥迪");
print(my_car.logo)


# 类不能调用实例属性,在init方法中的基本上都是实例属性
print(Car.logo) # AttributeError: type object 'Car' has no attribute 'logo'

# 类可以调用自己的属性
Car.wheel    # 输出  四个轮子
2、init方法将属性写为常量

init方法中的参数设置值,设置后就是一个默认值,但是在初始化对象时可以修改属性值

class Car:
    
    wheel = "四个轮子"
    engine = True
    # 定义init方法,并给对象的属性赋值
    def __init__(self,cl = "黑色",lg = "五菱神车"):
        self.color = cl
        self.logo  = lg
        print(f"我正在开着一辆{self.color}的{self.logo}在兜风~")


# 实例化一个对象,会使用默认的属性值
her_car = Car()    # 输出:我正在开着一辆黑色的五菱神车在兜风~

# 在初始化时,可以修改init方法中的属性值
he_car = Car("白色","特斯拉")  # 输出:我正在开着一辆白色的特斯拉在兜风~

3、self 关键字解读

1、概述

1、self指的就是对象本身,类里面的方法默认会自己加上self,用来表示一个对象

2、self 变量可以改名字,但是不建议修改

3、在类里面定义实例属性,一定要加self,表示这是一个实例对象的属性,不加会报错

4、类中的方法

类中的方法等价于在类里面写函数,类中的函数,类和类的对象都可以调用,举例如下:

2、对象

定义对象:建立在类的基础上,先有类再有对象,可以使用 对象名 = 类名() 来定义一个对象,对象可以调用类中的方法和属性,也可以修改类中init函数的参数值

3、属性

概述:

1、类/对象的特征和状态,例如:车类,它有颜色、logo、车轮、油车还是电车

2、可以通过类获取,也可以通过对象获取

3、可以修改、增加类的属性值

4、在对象(实例)中,属性是个体有的,非这个类都有的,例如:水果中,香蕉的皮是黄色的,火龙果的皮是玫红色的,这就是他们的个体特性

5、对象修改属性,修改的都是对象个体的属性,非整个类或者所有这个类的对象的属性

备注:一般对象属性使用较类的属性多,因此后续大部分情况都会定义为实例的属性

1、动态属性(反射)

1、概述
动态属性就是给类和对象设置属性、获取属性、删除属性、修改属性的操作,主要是用在项目中,一些测试数据不能提前在设计测试用例的时候,必须是测试运行起来中间产生的数据,例如:

- token:登录成功后反悔了token,用户鉴权令牌

- 项目创建后,产生的id

以上这2种,需要动态添加,不能使用init函数初始化、提前设置

2、动态属性的关键字
  1. hasattr(对象/类,"属性名"): 判断类/对象是否有属性 ,结果是布尔值 ——True  False
  2. getattr(对象/类,"属性名"): 获取类/对象的属性的值
  3. delattr(对象/类,"属性名"): 删除类/对象的属性

使用举例:

class Car:
    wheel = "True"
    engine = "True"
    def __init__(self,cl = "白色",lg = "宝马"):
        self.name = "四个轮子的车车"
        self.color = cl
        self.logo = lg
        print("正在生成一俩车")

    def driving(self):
        print("正在行驶哦~")

# 使用动态属性添加元素
setattr(Car,"speed","350km/h")
print(Car.speed)

# 删除一个元素
deleteAttr = delattr(Car,"wheel")
print(deleteAttr)

# print(Car.wheel)    # 报错,已经没有这个元素了
Traceback (most recent call last):
  File "E:\python310\py001\类和对象2\pratices\动态属性.py", line 19, in <module>
    print(Car.wheel)    # 报错
AttributeError: type object 'Car' has no attribute 'wheel'

# 判断当前类是否有该元素
speed = hasattr(Car,"speed")
print(speed)

4、扩展

1、已知参数类型,进行传参

在写函数的时候,如果参数确定类型,那么可以使用一下方式,这样在函数中也可以调用这个类型的对象的方法和属性,如下举例:

# 先定义一个类
class Fruit:
    apple = "青苹果"
    banana = "绿香蕉"
    def __init__(self):
        self.ftuits = []

    def add_fruit(self,name):
        if name in self.ftuits:
            print("此种水果已经在水果种类里~")
        else:
            self.ftuits.append(name)
            print("添加成功~")


# 定义一个函数
def get_fruit(obj: Fruit):
    obj.apple
    obj.banana
    obj.add_fruit("猕猴桃")

fruit = Fruit()
get_fruit(fruit)    # 输出    添加成功

2、init函数中设置常量

# 写一个车类
class Car:
    wheel = "True"
    engine = "True"
    def __init__(self,name,cl = "白色",lg = "宝马"):
        self.name = "四个轮子的车车"
        self.color = cl
        self.logo = lg
        print("正在生成一俩车")
        print(f"{self.name}车的颜色是{self.color},品牌是{self.logo}")

# 实例化一个车对象,传递3个参数
new_car1 = NewEnergyCar("五个轮子的","黑色","五菱神车")
输出:
正在生成一俩车
四个轮子的车车车的颜色是黑色,品牌是五菱神车

# 实例化一个车对象,传递2个参数
new_car2 = NewEnergyCar("粉色的","五菱")
输出:
正在生成一俩车
四个轮子的车车车的颜色是五菱,品牌是宝马
######结论:直接在init函数中赋值的,就是对象的常量,在初始化时,是否传参不会报错,对结果无影响######

3、给类添加属性有2种方式

  1. 直接添加
  2. 使用动态方法添加

看如下例子:

# 方式一
Car.speed = "350km/h"
# 方式二
setattr(Car,"speed","350km/h")

5、继承

1、一重继承

1、继承的概述

类比生活中的例子,类似于“皇位继承”,而在代码中集成的好处是,可以不要从0开始写代码,可以继承父类的方法和属性直接继承过来。

2、继承的特点

1、类的继承是语法:直接在括号里写另外一个类的名字,例如:class NewCar(Car),就是NewCar类继承了Car类,可以继承父类的所有方法和属性

2、子类可以写自己的方法,父类不能使用子类的方法

3、子类还可以重写父类的方法:子类方法跟父类同名的方法,会使用子类的方法(相当于子类重写了父类的方法,init函数也不例外)

4、子类可以多继承和多层继承:同时继承多个父类,拥有多个父类的属性和方法

简单举例:

class Car:
    wheel = "True"
    engine = "True"
    def __init__(self,cl = "白色",lg = "宝马"):

        self.color = cl
        self.logo = lg
        print("正在生成一俩车")
        print(f"车的颜色是{self.color},品牌是{self.logo}")

    def driving(self):
        print("正在开车···")
            # 调用实例的属性
        print(f"我开车的颜色是{self.color},品牌是{self.logo}")
            # 调用方法
        self.recharge()
    def recharge(self):
        print(f"我的小车车正在充电~")

# 写一个新的类,继承 Car
class NewEnergyCar(Car):
# 如果在子类里写init方法,相当于重写了父类的init方法,子类的对象就不能调用父类的方法和属性了
    def __init__(self,isnew):
        self.isnew = isnew
        print(f"这是一辆{isnew}车")

    def save_money(self):
        print("新能源车可以省钱~")

new_car = NewEnergyCar("黑色") 
new_car.recharge()
print(new_car.wheel)
# 输出:
这是一辆黑色车
我的小车车正在充电~
True

# 如果按照父类的init的方法去实例化一个对象,则会报错
new_car1 = NewEnergyCar("黑色","五菱神车")
# 输出报错,这是因为子类重写了父类的init方法,就不能再用父类的init参数,去实例化对象了
Traceback (most recent call last):
  File "E:\python310\py001\类和对象2\pratices\d2_类的继承.py", line 36, in <module>
    new_car1 = NewEnergyCar("黑色","五菱神车")
TypeError: __init__() takes 2 positional arguments but 3 were given

注释掉子类的init方法后,可以继续使用父类的init函数参数初始化对象,如下举例:

new_car1 = NewEnergyCar("黑色","五菱神车")

# 输出
正在生成一俩车
车的颜色是黑色,品牌是五菱神车

2、多重继承

多重继承,即一个类有多个父类,这个类的对象,可以调用所有负累的属性和方法,举列如下:

class Car:
    wheel = "True"
    engine = "True"
    def __init__(self,cl = "白色",lg = "宝马"):
        self.name = "四个轮子的车车"
        self.color = cl
        self.logo = lg
        print("正在生成一俩车")
        print(f"{self.name}车的颜色是{self.color},品牌是{self.logo}")

    def driving(self):
        print("正在开车···")
            # 调用实例的属性
        print(f"我开车的颜色是{self.color},品牌是{self.logo}")
            # 调用方法
        self.recharge()
    def recharge(self):
        print(f"我的小车车正在充电~")

# 写一个新的类,继承 Car
class NewEnergyCar(Car):
    def save_money(self):
        print("新能源车可以省钱~")

class Robotcar():
    def AITools(self):
        print("语音识别功能~")

# 继承2个类
class AutoCar(NewEnergyCar,Robotcar):
    def info(self):
        print("我继承了2个类")

# 这个对象可以调用所有继承类的方法
auto_car = AutoCar()
auto_car.AITools()
auto_car.info()
# 输出
正在生成一俩车
四个轮子的车车车的颜色是白色,品牌是宝马
语音识别功能~
我继承了2个类

备注,需要注意如下情况,Car类中的init函数有常量,那么在子实例化时,需要加上这个变量,不然会报错:

class Car:
    wheel = "True"
    engine = "True"
    def __init__(self,name,cl = "白色",lg = "宝马"):
        # 此时name就是一个常量
        self.name = "四个轮子的车车"   
        self.color = cl 
        self.logo = lg
        print("正在生成一俩车")
# 则 AutoCar的对象需要这样写
autoCar = AutoCar("随便写")

# 不写会报错
autoCar = AutoCar()
错误信息:
Traceback (most recent call last):
  File "E:\python310\py001\类和对象2\pratices\d2_类的继承.py", line 35, in <module>
    auto_car = AutoCar()
TypeError: __init__() missing 1 required positional argument: 'name'

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 面向对象的程序设计分为两种,一种是基于类的,另一种是基于原型的。其中基于类的程序设计是最常见的一种,它主要涉及到两个概念,即类和对象。类是一个抽象的概念,它描述了一类具有相同属性和方法的对象,而对象则是具体的实例。在基于类的程序设计中,类用于描述对象的属性和方法,而对象则是类的具体实现。因此,基于类的程序设计更注重对象的封装、继承和多态等概念。 ### 回答2: 面向对象编程是一种程序设计范式,它把程序看作是一组对象的集合,每个对象都有一个特定的属性和方法。在Python中,每个对象都是一个类的实例,类是一个抽象的概念,用于表示一组相似的对象对象是类的实例,它继承了类的属性和方法,同时可以拥有自己的属性和方法。 在Python中,类定义的语法为: class ClassName: # 属性和方法 在类定义中,可以定义属性和方法,类的属性是一些数据,用来描述类的特征;类的方法是一些函数,用来描述类的行为。同时,类还可以继承其他类的属性和方法,通过继承,子类可以重用父类的代码,同时也可以增加自己的属性和方法。 在Python中,对象的创建和使用的语法为: object_name = ClassName() 在对象的创建过程中,会调用类的构造函数(__init__()方法),用来初始化对象的属性和方法。然后,可以使用对象的属性和方法来完成具体的任务。 在面向对象编程中,有三个重要的概念,分别是封装、继承和多态。封装是指把数据和行为包装在一个类中,对外部隐藏具体的实现细节;继承是指子类可以继承父类的属性和方法,在子类中可以重写父类的方法和添加自己的方法;多态是指同一个方法可以在不同的对象上产生不同的结果,通过实现多态,程序可以更加灵活和可扩展。 最后,在Python中,还可以通过__str__()方法来自定义对象的字符串表示方式,方便输出和调试。同时,还可以通过@property和@setter装饰器来实现属性的封装和保护。 总之,类和对象是面向对象编程的基础,它提供了一种更加灵活和可扩展的编程方式,同时也对程序的设计和架构提出了更高的要求。因此,熟练掌握类和对象的相关知识,是Python编程的基础和必备技能。 ### 回答3: Python中的面向对象编程(Object-Oriented Programming,OOP)是一种将数据和行为封装在一起,以创建对象为中心的思想。在Python中,一切皆为对象,从简单的数字、字符串到复杂的列表、元组都是对象。面向对象(Object-Oriented)编程中最基本的两个概念是类和对象。 类是一种数据类型,是一组相关数据和方法的描述。其实就是一个对象的模板,包含了它所描述的对象共有的属性和方法。Python中定义类的方法比较简单,使用关键字`class`即可,例如: ```python class Dog: def __init__(self, name, age): self.name = name self.age = age def bark(self): print("汪汪!") ``` 上述代码定义了一个Dog类,包含了Dog对象共有的属性(name和age)和方法(bark)。通过关键字`def`定义Dog类的方法,其中`__init__`方法是一个特殊的方法,用于初始化类的对象属性。 当我们需要使用Dog类时,需要将它实例化为一个对象。例如: ```python dog1 = Dog("小黑", 3) dog1.bark() # 输出:汪汪! ``` 上述代码创建了一个Dog对象,设置了它的name为“小黑”,age为3,然后调用了Dog类的方法bark。 另外,Python中还有一些内置函数,可以用于操作类和对象。例如: - `type`函数:用于返回对象的类型。使用方法为`type(object)` - `isinstance`函数:用于检查对象是否为指定类的实例。使用方法为`isinstance(object, classinfo)` - `hasattr`函数:用于检查对象是否具有指定的属性。使用方法为`hasattr(object, name)` - `getattr`函数:用于获取对象的属性值。使用方法为`getattr(object, name[, default])` - `setattr`函数:用于设置对象的属性值。使用方法为`setattr(object, name, value)` 以上是Python中定义类和使用类的基本语法和函数,掌握了这些知识后,可以尝试设计自己的类并应用到实际的编程项目中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值