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学习吧

相关推荐
Juchecar9 分钟前
解惑:NumPy 中 ndarray.ndim 到底是什么?
python
用户83562907805119 分钟前
Python 删除 Excel 工作表中的空白行列
后端·python
Json_20 分钟前
使用python-fastApi框架开发一个学校宿舍管理系统-前后端分离项目
后端·python·fastapi
数据智能老司机7 小时前
精通 Python 设计模式——分布式系统模式
python·设计模式·架构
数据智能老司机8 小时前
精通 Python 设计模式——并发与异步模式
python·设计模式·编程语言
数据智能老司机8 小时前
精通 Python 设计模式——测试模式
python·设计模式·架构
数据智能老司机8 小时前
精通 Python 设计模式——性能模式
python·设计模式·架构
c8i8 小时前
drf初步梳理
python·django
每日AI新事件8 小时前
python的异步函数
python
使一颗心免于哀伤8 小时前
《设计模式之禅》笔记摘录 - 21.状态模式
笔记·设计模式