python学习笔记15 python中的类

上一篇我们介绍了python中的库 ,学习了一些常见的内置库。详细内容可点击-->python学习笔记14 python中的库,常见的内置库(random、hashlib、json、时间、os)

这一篇我们来看一下python中的类

创建一个类
python 复制代码
	class 类的名称():
    def __init__(self,参数1,参数2,...):
        代码块1
    def 方法名1(参数3,参数4,...):
        代码块2
    def 方法名2(参数5,参数6,...):
        代码块3
        ...

#特别注意:class类中的函数,
#        必须要有一个参数,且是第一个定义,self

#self: 表示当前调用该方法的对象
# 定义一个类
class Person:
    def eat(self):
        print("吃饭")

    def call(self,name):
        print(f"打电话给{name}")
通过一个类创建一个对象
python 复制代码
class Person:
    def eat(self):
        print("吃饭")

    def call(self,name):
        print(f"打电话给{name}")
# 相当于创建一个Person类的对象,将对象的地址值赋值给变量p1
p1 = Person()
p1.eat()    #吃饭
p1.call('王子奇')  #打电话给王子奇
通过一个类创建多个对象
python 复制代码
class Person:
    def eat(self):
        print("吃饭")

    def call(self,name):
        print(f"打电话给{name}")
# 相当于创建一个Person类的对象,将对象的地址值赋值给变量p1
p1 = Person()
p1.eat()    #吃饭
p1.call('王子奇')  #打电话给王子奇
print("----------------------------")
p2 = Person() # 在内存中开辟一个新的空间
p2.eat()    #吃饭
p2.call('王俊凯')  #打电话给王俊凯
print(id(p1)==id(p2)) # False 地址值不同
给对象赋予属性
  • 类中不写,创建对象的之后,单独为该对象创建新的属性
python 复制代码
class Person:
    def eat(self):
        print("吃饭")

    def call(self,name):
        print(f"打电话给{name}")

p1 = Person()
p1.name = '小虎'
print(f"p1对象的姓名为:{p1.name}")

p2 = Person() # 在内存中开辟一个新的空间
# print(f"p1对象的姓名为:{p2.name}") # 报错
  • 类中编写,创建对象的时候,直接就拥有了某个属性,并且可以直接赋值
python 复制代码
class Person:
    def __init__(self,name):
        # self.name 定义一个类中的属性,叫做name
        self.name = name

    def eat(self):
        print("吃饭")

    def call(self,name):
        print(f"打电话给{name}")

# 使用类名() 的方式创建对象,实际上底层调用的是类中的__init__(self)
# 若自己没写,默认一个类中有一个__init__(self),且只能有一个
p1 = Person('小虎')
print(f"p1对象的姓名为:{p1.name}")    #p1对象的姓名为:小虎

p2 = Person('张三')
print(f"p2对象的姓名为:{p2.name}")    #p2对象的姓名为:张三

练习题:

手机:

属性: 品牌, 价格, 颜色

行为:打电话, 发短信

python 复制代码
class Phone():
    def __init__(self,brand,price,color):
        self.brand=brand
        self.price=price
        self.color=color

    def call(self,name):
        print(f"正在打电话给{name}...")

    def send_message(self,name,text):
        print(f"给{name}发短信了,短信内容是:{text}")


if __name__ == '__main__':
    p1=Phone('HUAWEI',9999,"宝石蓝")
    p1.call('王俊凯')
    p1.send_message('王俊凯','你什么时候开演唱会')

    p2=Phone('XIAOMI',5999,"钻石白")
    p1.call('王子奇')
    p1.send_message('王子奇', '和黄景瑜在拍一个剧吧')
类的继承

继承是将多个类中的相同的部分,单独提取到一个类中,这些类于单独提出来的这个类产生一个关系,这个关系,就叫做继承关系,其他类中也就拥有了相同的部分,不需要特地定义出来。

通过继承,子类拥有了父类中的成员。

python 复制代码
class 父类:
    pass
class 子类(父类):
    pass
python 复制代码
class Student:
    def __init__(self,id,name,age):
        self.id=id
        self.name=name
        self.age=age

    def __str__(self):
        return f'Student:({self.id},{self.name},{self.age})'

    def study(self):
        print(f'{self.name}在学习')

    def play(self):
        print(f'{self.name}在玩')
class PrimaryStudent(Student):
    pass
class HighStudent(Student):
    pass
stu1=PrimaryStudent('20240001','图图',8)
stu1.study()
stu1.play()
stu2=HighStudent('20240002','莉莉',15)
stu2.study()
stu2.play()

特别注意:

  1. 子类无法继承父类中私有的成员

    python 复制代码
    class Fu:
        def fun1(self):
            print("好好学习,天天向上!")
        def __fun2(self):
            print("这是父类中私有的成员函数__fun2")
    class Son(Fu):
        pass
    s1 = Son()
    s1.fun1()
    s1.__fun2()
  2. 若子类中出现与父类的函数名以及函数参数都一样,只是实现不一样的情况,子类对象调用的是自己的函数

    python 复制代码
    class Fu:
        def fun1(self):
            print("好好学习,天天向上!")
        def __fun2(self):
            print("这是父类中私有的成员函数__fun2")
        def fun3(self):
            self.__fun2()
    class Son(Fu):
        def fun1(self):
            print("这是子类中的函数fun1")
        pass
    s1 = Son()
    s1.fun1()
  3. 子类中可以定义父类中没有的成员属性

    python 复制代码
    class Fu:
        def __init__(self,name,age):
            self.name = name
            self.age = age
    class Zi(Fu):
        def __init__(self, name, age, sid):
            super().__init__(name,age)
            self.sid = sid
    z1 = Zi('张三',18, 1001)
    print(z1.name,z1.age,z1.sid)    #张三 18 1001
  4. 子类继承父类的同时,可以出现父类中没有的行为

    python 复制代码
    class Fu2:
        def fun1(self):
            print("shujia")
    class Zi2(Fu2):
        def show(self):
            print("shujia666")
    # d1 = Fu2()
    # d1.fun1()
    # d1.show() #报错
    d2 = Zi2()
    d2.fun1()
    d2.show()
  5. 子类中可以使用super()来调用父类中非私有的成员

    python 复制代码
    class Fu:
        def fun1(self):
            print("这是父类中的fun1")
    class Zi(Fu):
        def fun1(self):
            print("这是子类中的fun1")
        def show(self):
            self.fun1() # 调用的是子类中重写后的fun1函数
            # 调用父类中的fun1
            super().fun1()
    z = Zi()
    z.show()
  6. 在python中一个类可以同时继承多个类

    python 复制代码
    class Fu:
        def fun1(self):
            print("这是父亲中的函数fun1")
    class Mather:
        def fun2(self):
            print("这是母亲中的函数fun2")
    class Son(Fu, Mather):
        def fun3(self):
            print("这是儿子自己的函数")
    s1 = Son()
    s1.fun1()
    s1.fun2()
    s1.fun3()

    若同时继承的类中有相同的函数名,谁先写就调用谁的

    python 复制代码
    class Fu:
        def fun1(self):
            print("这是父亲中的函数fun1")
        def show(self):
            print("这是父亲中的函数show")
    class Mather:
        def fun2(self):
            print("这是母亲中的函数fun2")
        def show(self):
            print("这是母亲中的函数show")
    class Son(Mather,Fu):
        def fun3(self):
            print("这是儿子自己的函数")
    s1 = Son()
    s1.fun1()
    s1.fun2()
    s1.fun3()
    s1.show() # 调用的是母亲中的show
多态

表示的是某一个事物在不同时刻下的不同状态

在python中默认支持多态,因为python是动态数据类型语言。

python 复制代码
class Animal:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def __str__(self):
        return f"name:{self.name}, age:{self.age}"
    def eat(self):
        print("吃")
    def sleep(self):
        print("睡")
#抽象
class Dog(Animal):
    pass
a1 = Animal('小黄',2)
a1 = Dog('小黑',3)
print(a1)   #name:小黑, age:3
抽象
python 复制代码
from abc import abstractmethod
# from typing import override
class Animal:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def __str__(self):
        return f"name:{self.name}, age:{self.age}"

    @abstractmethod
    def eat(self):
        pass
    @abstractmethod
    def sleep(self):
        pass


class Dog(Animal):
    # @override
    def eat(self):
        print("🐕吃🥩")
    # @override
    def sleep(self):
        print("🐕趴着睡")
    # a1 = Animal('小黄',2)
a1 = Dog('小黑',3)
a1.eat()    #🐕吃🥩
a1.sleep()  #🐕趴着睡
类变量

将变量定义在类中函数外

python 复制代码
class Demo1:
# 类变量
    a = 100
    def fun1(self):
        a = 10
        print(a)
        print(Demo1.a) # 通过类名直接访问
d1 = Demo1()
d1.fun1()
print(d1.a) # 也可以通过对象名进行访问

下一篇我们来几个关于类的练习题结束我们python的基础语法内容啦。

我们即将进入python的进阶内容,数据分析numpy、pandas、matplotlib的学习!

点赞收藏关注,一起打卡python学习吧

相关推荐
lancyu12 分钟前
关于多轮对话机器人的上下文Token优化和解决方案
人工智能·python·深度学习·机器学习·chatgpt·机器人·prompt
草莓橙子碗42 分钟前
Claude 使用指南
开发语言·python
hsjiasb1 小时前
FreeRTOS学习(三十九)——最终总结
学习·学习笔记·freertos
工具分享1 小时前
陪跑跟品爆单AI选品助手,高效跟品会赔本吗?
人工智能·python
COOLMO研究AI1 小时前
Python 如何实现 AI API 的提示词(Prompt)版本管理与热更新
人工智能·python·prompt
老郑聊AI业财智造1 小时前
Transformer 技术架构与源码分析
人工智能·python·深度学习·语言模型·架构·transformer·软件工程
程序员三藏1 小时前
自动化测试用例编写详解
自动化测试·软件测试·python·功能测试·测试工具·职场和发展·测试用例
m4Rk_2 小时前
【论文阅读】Agent 记忆机制(47):Nemori——用“预测误差”判断什么经验值得被记住
论文阅读·人工智能·学习·开源·github
230万光年的思念2 小时前
分子动力学模拟参考文献
python
约克32 小时前
2024年空调除甲醛技术参数与性能评测解析
学习