zoukankan      html  css  js  c++  java
  • 009-Python-面向对象

    1.面向对象:

    1.1什么是类?
    类:把一类事物的相同的特征和动作整合到一起就是类,类是一个抽象的概念;

    1.2什么是对象?
    对象:就是基于类而创建的一个具体事物(具体存在的)也是特征和动作整合到一起的;

    类属性包含:数据属性,函数属性;

    属性分为两种:数据属性和函数属性

    实例没有函数属性;

    2.类属性的增删改查;

    1类的查询,传参

    class school:
        def __init__(self,name,addr,type):
    
            self.mingzi = name
            self.dizhi = addr
            self.leixing = type
        def kao_shi(self):
            print("%s 学校要考试!!" % self.mingzi)
    
        def zhao_sheng(self):
            print("%s%s%s 正在招生" % (self.country, self.leixing, self.dizhi))
    
    # 传参
    s1 = school("清华","清华园","国营")
    
    # 从类中取出数据属性;
    print("国家:", s1.country)
    print("校名:", s1.mingzi)
    
    # 从类中查看函数属性;
    s1.kao_shi()
    s1.zhao_sheng()
    

    输出:

    国家: China
    校名: 清华
    清华 学校要考试!!
    China国营清华园 正在招生
    

    2.2向类中增加,数据属性:

    class School:
        def __init__(self,name,addr,type):
    
            self.mingzi = name
            self.dizhi = addr
            self.leixing = type
        def kao_shi(self):
            print("%s 学校要考试!!" % self.mingzi)
    
        def zhao_sheng(self):
            print("%s%s%s 正在招生" % (self.country, self.leixing, self.dizhi))
    
    # 增加
    School.tuan = "共青团"
    print(School.tuan)
    

    输出:

    共青团
    

    2.3向类修改,数据属性:

    class School:
        def __init__(self,name,addr,type):
    
            self.mingzi = name
            self.dizhi = addr
            self.leixing = type
        def kao_shi(self):
            print("%s 学校要考试!!" % self.mingzi)
    
        def zhao_sheng(self):
            print("%s%s%s 正在招生" % (self.country, self.leixing, self.dizhi))
    # 修改
    School.country="日本"
    print(School.country)
    

    输出:

    日本
    

    2.4向类删除,数据属性:

    class School:
        def __init__(self,name,addr,type):
    
            self.mingzi = name
            self.dizhi = addr
            self.leixing = type
        def kao_shi(self):
            print("%s 学校要考试!!" % self.mingzi)
    
        def zhao_sheng(self):
            print("%s%s%s 正在招生" % (self.country, self.leixing, self.dizhi))
    
    # 删除
    del School.country
    print(School.country)
    

    输出:

    ERROR:AttributeError: type object 'School' has no attribute 'country'
    

    3.函数属性的增删改查;

    3.1函数属性的增加

    class School:
        country = "China"
    
        def __init__(self,name,addr,type):
    
            self.mingzi = name
            self.dizhi = addr
            self.leixing = type
            
        def kao_shi(self):
            print("%s 学校要考试!!" % self.mingzi)
    
        def zhao_sheng(self):
            print("%s%s%s 正在招生" % (self.country, self.leixing, self.dizhi))
    
    s1 = School("清华", "清华园", "国营")
    
    # 增加函数属性,并调用增加的函数属性
    def eat_food(self, food):
        print("%s 正在吃 %s" % (self.mingzi, food))
    
    School.eat = eat_food
    s1.eat("水果")
    School.eat(s1, "水果")
    

    输出:

    清华 正在吃 水果
    清华 正在吃 芒果
    

    3.2函数属性的修改(重新定义一个,覆盖即可)

    class School:
        country = "China"
    
        def __init__(self,name,addr,type):
    
            self.mingzi = name
            self.dizhi = addr
            self.leixing = type
            
        def kao_shi(self):
            print("%s 学校要考试!!" % self.mingzi)
    
        def zhao_sheng(self):
            print("%s%s%s 正在招生" % (self.country, self.leixing, self.dizhi))
    
    s1 = School("清华", "清华园", "国营")
    
    # 修改
    def test(self):
        print("test %s 不愿意考试!!" % self.mingzi)
    
    School.kao_shi = test
    
    # 调用kao_shi()
    s1.kao_shi()
    

    输出:

    test 清华 不愿意考试!!
    

    4.实例属性的增删改查(就是对象)

    4.1实例属性的生成和查看

    class Chinese:
        country = "China"
        def __init__(self,name):
            self.mingzi = name
    
        def play_ball(self,ball):
            print("%s 正在打 %s" %(self.mingzi, ball))
            
    # 生成一个实例
    p1 = Chinese("李雷") 
    # 查看实例的实例属性
    print(p1.__dict__)
    print(p1.mingzi)
    

    输出:

    {'mingzi': '李雷'}
    李雷
    

    4.2实例数据 属性的增加和查看

    class Chinese:
        country = "China"
        def __init__(self,name):
            self.mingzi = name
    
        def play_ball(self,ball):
            print("%s 正在打 %s" %(self.mingzi, ball))
    
    p1 = Chinese("李雷")
    print(p1.__dict__)
    
    # 增加'age': 18
    p1.age = 18
    
    print(p1.__dict__)
    print(p1.age)
    

    输出:

    {'mingzi': '李雷'}
    {'age': 18, 'mingzi': '李雷'}
    18
    

    4.3实例数据 属性的修改

    class Chinese:
        country = "China"
        def __init__(self,name):
            self.mingzi = name
    
        def play_ball(self,ball):
            print("%s 正在打 %s" %(self.mingzi, ball))
    
    p1 = Chinese("李雷")
    print(p1.__dict__)
    # 修改'age': 19,直接覆盖
    p1.age = 18
    p1.age = 19
    
    print(p1.__dict__)
    print(p1.age)
    

    输出

    {'age': 19, 'mingzi': '李雷'}
    19
    

    4.4实例数据 属性的删除

    class Chinese:
        country = "China"
        def __init__(self,name):
            self.mingzi = name
    
        def play_ball(self,ball):
            print("%s 正在打 %s" %(self.mingzi, ball))
    
    p1 = Chinese("李雷")
    print(p1.__dict__)
    p1.age = 19
    
    # 删除age
    del p1.age
    print(p1.__dict__)
    

    输出:

    {'mingzi': '李雷'}
    

    5.容易误导的地方:

    5.1在修改p1.country = "日本"的时候,其实是在给实例赋值;在__init__中定义一个字典,并不会影响类的country值;

    class Chinese:
        country = "China"
        def __init__(self,name):
            self.mingzi = name
    
        def play_ball(self,ball):
            print("%s 正在打 %s" %(self.mingzi,ball))
    
    p1 = Chinese("李雷")
    
    print(p1.country)
    
    # 在p1实例字典中 __init__ 添加country = "日本" 和 类中的country没有关系
    p1.country = "日本"
    print(p1.__dict__)
    
    print(Chinese.country)
    print(p1.country)	
    

    输出:

    China
    {'mingzi': '李雷', 'country': '日本'}
    类里的country: China
    实例的country: 日本
    

    5.2当在类中定义了列表,向列表中添加值

    class Chinese:
        country = "China"
        l = ["a", "b"]
    
        def __init__(self,name):
            self.mingzi = name
    
        def play_ball(self,ball):
            print("%s 正在打 %s" % (self.mingzi, ball))
    
    p1 = Chinese("李雷")
    
    print(p1.l)
    
    # 添加“c”到列表中:
    p1.l.append("c")
    print(p1.__dict__)
    print(Chinese.l)
    

    输出:

    ['a', 'b']
    {'mingzi': '李雷'}
    ['a', 'b', 'c']
    

    6.静态属性、类方法、静态方法:

    1.静态属性,在一个函数前面加上property,把函数封装成数据属性的形式,在外部调用时看不出内部的逻辑关系;
    静态属性特点:静态属性既可以访问实例属性,又可以访问类的属性;

    2.类方法:在一个函数前面加上classmethod,这个函数的参数默认被写为cls,cls代表类
    类的数据属性,类的函数属性,不能访问实例的属性;

    3.静态方法:在一个函数前面加上staticmethod,这个函数可以有参数,但是不能访问类属性,也不能访问实例属性,属于自己;叫做类的工具包

    6.1通过@property 装饰器功能将,函数属性隐藏为数据属性的调用;

    class Room:
        def __init__(self, name, zhuren, kuan, chang, gao):
            self.name = name
            self.zhuren = zhuren
            self.kuan = kuan
            self.chang = chang
            self.gao = gao
    
        # def jisuan(self):
        @property
        def jisuan(self):
            return "%s 住在 %s 房间面积是:%s" % (self.zhuren, self.name, self.kuan * self.chang)
            # 将函数内的数据return返回给jisuan
    r1 = Room("天上人间", "李雷", 20, 30, 4.5)
    
    print(r1.jisuan)
    print(r1.name)
    

    输出:

    李雷 住在 天上人间 房间面积是:600
    天上人间
    

    6.2通过@classmethod装饰器,跟实例没有任何的关系,只是类级别的操作,类调用自己的方法
    classmethod就是给类调用类属性用的;

    class Room:
        tag = "tag_v1.0"
        def __init__(self, name, zhuren, kuan, chang, gao):
            self.name = name
            self.zhuren = zhuren
            self.kuan = kuan
            self.chang = chang
            self.gao = gao
    
        @classmethod
        def tell_info(cls, x):
            print(cls)
            print("=====>", cls.tag, x)
    
    Room.tell_info("haha")
    

    输出:

    <class '__main__.Room'>
    =====> tag_v1.0 haha
    

    6.3静态方法:自己访问自己,属于类的工具包,不跟类绑定也不更具体的实例绑定;不能调用类的属性cls 和 实例属性self:

    class Room:
        tag = "tag_v1.0"
        def __init__(self, name, zhuren, kuan, chang, gao):
            self.name = name
            self.zhuren = zhuren
            self.kuan = kuan
            self.chang = chang
            self.gao = gao
    
        @staticmethod  # 类的工具包,不跟类绑定,也不跟具体的实例绑定
        def wash_body(a, b, c):
            print("%s %s %s 正在洗澡" % (a, b, c))
    
    
    r1 = Room("天上人间", "李雷", 20, 30, 4.5)
    
    Room.wash_body("李雷", "韩梅梅", "小明")
    r1.wash_body("李雷", "韩梅梅", "小明")
    

    输出:

    李雷 韩梅梅 小明 正在洗澡
    李雷 韩梅梅 小明 正在洗澡
    

    7.组合

    定义一个人的类,人有头,躯干,手,脚等数据属性,这几个属性又可以是通过一个类实例化的对象,这就叫做组合;

    用途:
    1.做关联
    2.小的组成大的
    7.1 在两个不同的类中将学校和课程关联起来

    class School:
        def __init__(self, name, addr):
            self.name = name
            self.addr = addr
    
        def zhao_sheng(self):
            print("%s 正在 %s 招生" % (self.name, self.addr))
    
    
    class KeCheng:
        def __init__(self, name, xuefei, date_time, school):
            self.name = name
            self.xuefei = xuefei
            self.date_time = date_time
            self.school = school
    
    s1 = School("oldboy", "北京")
    s2 = School("oldboy", "南京")
    s3 = School("oldboy", "东京")
    
    # c1 = KeCheng("linux", 10000, "60day", s1)
    
    msg = '''
    1 天上人间 北京校区
    2 天上人间 南京校区
    3 天上人间 东京校区
    '''
    
    while True:
        print(msg)
        menu_dic = {
            "1": s1,
            "2": s2,
            "3": s3
        }
    
        choice = input("选择学校>>:")
        school_object = menu_dic[choice]
    
        name = input("你的课程>>:")
        xuefei = input("你的学费>>:")
        date_time = input("你的课时>>:")
    
        new_course = KeCheng(name, xuefei, date_time, school_object)
        print("课程【%s】属于【%s】学校" % (new_course.name, new_course.school.name))
    

    7.2 组合:将课程对象,添加到学生对象和老师对象中

    class QinghuaPeople:
        school = 'Qinghua'
    
        def __init__(self, name, age, sex):
            self.name = name
            self.age = age
            self.sex = sex
    
        def eat(self):
            print('is eating')
    
    
    class QinghuaStudent(QinghuaPeople):
        def __init__(self, name, age, sex):
            QinghuaPeople.__init__(self, name, age, sex)
            self.course = []
    
        def learn(self):
            print('%s is learning' % self.name)
    
    
    class QinghuaTeacher(QinghuaPeople):
        def __init__(self, name, age, sex, salary, title):
            QinghuaPeople.__init__(self, name, age, sex)
            self.salary = salary
            self.title = title
            self.course = []
    
        def teach(self):
            print('%s is teaching' % self.name)
    
    
    # 设置一个组合
    class Course:
        def __init__(self, course_name, course_period, course_price):
            self.course_name = course_name
            self.course_period = course_period
            self.course_price = course_price
    
        def tell_info(self):
            print('<课程名:%s 周期:%s 价格:%s>' % (self.course_name, self.course_period, self.course_price))
    
    
    # 定义的课程 Course 对象
    python = Course('Python', '6mons', 3000)
    linux = Course('Lnux', '3mons', 2000)
    bigdata = Course('BigData', '1mons', 1000)
    
    # 定义 Teacher 对象
    egen1 = QinghuaTeacher("egen", 18, "nv", 300, "军师")
    
    # 将课程追加到 Teacher 对象的 course 数据属性[]列表中
    egen1.course.append(python)
    egen1.course.append(linux)
    
    # 查看列表中包含哪些 内容
    for i in egen1.course:
        # 通过 调用 tell_info() 函数属性 打印出来
        i.tell_info()
    
    
    # 定义 Student 属性
    xiaoming = QinghuaStudent("xiaoming",19,"nan")
    
    # 将课程追加到 Student 对象的 course 数据属性[] 列表中
    xiaoming.course.append(python)
    xiaoming.course.append(bigdata)
    
    # 学生的课程信息
    for i in xiaoming.course:
        i.tell_info()
    

    输出:

    <课程名:Python 周期:6mons 价格:3000>
    <课程名:Lnux 周期:3mons 价格:2000>
    <课程名:Python 周期:6mons 价格:3000>
    <课程名:BigData 周期:1mons 价格:1000>
    

    8.继承

    1.什么是继承
    继承就像是,子类继承父类的特性;
    2.单继承于多继承
    单继承将一个父类的继承,多继承将多个父类继承到自身;

    8.1什么时候用继承

    当类之间有很多相同的功能,提取这些共同的功能做成基类,用继承比较好!

    class Animal:
        def eat(self):
            print("%s 吃" % self.name)
    
        def drink(self):
            print("%s 喝" % self.name)
    
        def shit(self):
            print("%s 拉" % self.name)
    
        def pee(self):
            print("%s 撒" % self.name)
    
    class Cat(Animal):
    
        def __init__(self,name):
            self.name = name
            self.breed = "猫"
    
        def cry(self):
            print("喵喵叫")
    
    class Dog(Animal):
    
        def __init__(self,name):
            self.name = name
            self.breed = "狗"
    
        def cry(self):
            print("汪汪叫")
    
    c1 = Cat("小白家的小黑猫")
    c1.eat()
    
    c2 = Cat("小黑家的小白猫")
    c2.drink()
    
    d1 = Dog("胖子家的小瘦狗")
    d1.shit()
    

    输出:

    小白家的小黑猫 吃
    小黑家的小白猫 喝
    胖子家的小瘦狗 拉
    

    8.2接口继承

    1.什么是接口
    接口就是一个函数,接口继承的含义就是定义一个基类,基类中将自己的方法定义成接口函数,利用@abc.abstractmethod,这样只要来一个之类就必须 实现这个方法否则无法实例化;
    用于定义接口函数,定义一个基类,如若将自己的方法定义@abc.abstractmethod 接口函数
    2.如例子:
    将All_file定义为一个基类,将函数read和write定义为接口函数;
    其子类继承基类,必须实现read和write函数的功能,才能实例化;
    基类用于规范,可以不用实例化,用子类的实现功能。

    import abc
    
    class All_file(metaclass=abc.ABCMeta):
        @abc.abstractmethod
        def read(self):
            pass
        @abc.abstractmethod
        def write(self):
            pass
    
    class Disk(All_file):
        def read(self):
            print("Disk read")
    
        def write(self):
            print("Disk write")
    
    class Mem(All_file):
        def read(self):
            print("Mem read")
    
        def write(self):
            print("Mem write")
    
    m1 = Mem()
    
    m1.read()
    m1.write()
    

    8.3子类调用 父类的方法,派生super():

    1.子类继承了父类的方法,然后想基于原有的基础上修改,那么就需要在子类中调用父类的方法;使用super()指定父类的方法:

    class Vehichle:
        Country = "China"
    
        def __init__(self, name, speed, load, power):
            self.name = name
            self.speed = speed
            self.load = load
            self.power = power
    
        def run(self):
            print("地铁开动了")
    
    
    class Subway(Vehichle):
        def __init__(self, name, speed, load, power, line):
            super().__init__(name, speed, load, power)
            self.line = line
    
        def run(self):
            super().run()
            print("%s %s 开动了" % (self.name, self.line))
    
    s1 = Subway("北京地铁", "80迈", "10000人", "电", 2)
    s1.run()
    

    输出:

    地铁开动了
    北京地铁 2 开动了
    
  • 相关阅读:
    第十六节:Linq用法大全(四)
    第十五节:EF Core大数据量处理(一)之EFCore.BulkExtensions
    第十四节:EF Core性能优化
    查看mysql执行的线程,并杀掉他
    docker安装与卸载
    新手根据菜鸟教程安装docker,从No package docker-io available开始遇到的坑...(转)
    MySQL启动出现The server quit without updating PID file错误解决办法
    Linux下彻底卸载mysql详解
    Linux 下的 Redis 安装 && 启动 && 关闭 && 卸载
    Linux安装mysql
  • 原文地址:https://www.cnblogs.com/baolin2200/p/6495803.html
Copyright © 2011-2022 走看看