zoukankan      html  css  js  c++  java
  • 【11】Python面向对象:封装和继承(类、函数/方法、重写)

    面向对象基础:实例/对象、实例化


    举例,有个买车处,可以包含买车、买保险、交税、上牌

    #面向过程
    def buyCar():
        print('买车')
    def baoxian():
        print('保险')
    def jiaoshui():
        print('交税')
    def shangpai():
        print('上牌')
    buyCar()
    baoxian()
    jiaoshui()
    shangpai()
    
    
    # 面向对象,把方法写在类中
    class BuyCar:
        def buyCar(self,):
            print('买车')
    
        def baoxian(self,):
            print('保险')
    
        def jiaoshui(self,):
            print('交税')
        def shangpai(self):
            print('上牌')
    
    xw = BuyCar()#实例化,xw是实例,也可以叫对象
    xw.buyCar()# 调用方法
    xw.baoxian()
    xw.jiaoshui()
    xw.shangpai()

    面向对象:封装

    构造函数、私有方法

    # 数据库类
    import pymysql
    class Db:
    
        # 构造函数,类在实例化的时候会自动执行构造函数,会把参数传入
        def __init__(self, host, user, password, db, port=3306, charset='utf8'):
            self.db_info = {'user': user, 'password': password, "db": db, "port": port, 'charset': charset,
                            'autocommit': True, 'host': host}
            self.__connect()
    
        # 私有方法:加两个下划线,只能在类里面调用,出了类就不行了
        def __connect(self):  # 连接数据库
            try:
                self.conn = pymysql.connect(**self.db_info)  # 建立连接
            except Exception as e:
                # print("连接不上数据库")
                raise Exception("连接不上数据库,请检查数据库连接信息")  # raise主动抛出一个异常
            else:
                self.cur = self.conn.cursor(pymysql.cursors.DictCursor)
    
        def execute_one(self, sql):  # 执行sql
            self.cur.execute(sql)
            return self.cur.fetchone()
    
        def __close(self):  # 关闭
            self.conn.close()
            self.cur.close()
    
    
    mysql = Db('118.24.3.40', 'jxz', '123456', 'jxz')  # 实例化,并传入参数
    result = mysql.execute_one('select * from app_myuser;')


    类、类变量、实例变量、私有变量构造方法、析构方法、静态方法、类方法、实例方法、属性方法

    class Person:  # 经典类
        country = 'China' # 类变量
        base_price = 8000# 价格
        discount = 0.1#折扣
    
        # 构造方法,类在实例化的时候会自动执行构造函数,会把参数传入
        def __init__(self, uid, name):
            print('self的内存地址:', id(self))
            self.id = uid  # 实例变量
            self.name = name  # pep8
            self.__base_price = 8000#私有变量:加两个下划线,只能在类里面用,出了类就不行了
    
        # 析构方法:实例被销毁的时候自动调用的方法,不再占用内存
        def __del__(self):
            print("析构方法")
    
        # 静态方法:只是写在类里面的一个方法,不能使用类变量,调用不了其他的类方法。
        @staticmethod
        def help():
            print("静态方法")
    
        # 类方法,不需要实例化,需要加上装饰器 @classmethod
        @classmethod
        def sayCountry(cls):
            cls.getClassname()
            print(cls.country)
    
    
        # 实例方法:带有self的方法,必须要实例化之后才能使用的函数
        def housework(self):
            print('%s正在做家务' % self.name)
            print('国籍是%s' % self.country)
    
        #属性方法:看起来像变量的一个方法,无参数。
        @property
        def price(self,):
            return self.base_price - self.base_price * self.discount#计算价格
    
    
    Person.country = 'USA'
    Person.sayCountry()
    xh = Person(1, '小黑') 
    xh.housework() 
    xh.sayCountry()
    xh.help()
    print(xh.country)

    面向对象:继承

    继承、重写、私有方法无法继承、mro算法

     #父类
    class Lw:
        money = 500000
        def make_money(self):
            print('挣钱 50000')
        def __driver(self): #私有方法无法被继承
            print('开车')
    #父类2
    class Ll:
        def cook(self):
            print('做饭')
        def make_money(self):
            print('挣钱一万')
    
    #子类
    #python中子类可以继承多个父类,java只能一个
    class Xw(Lw,Ll):
        def make_money(self): #重写,和父类的方法名一样,先调用自己的方法
            print('挣钱')
    
    
    xw = Xw()
    print(Xw.mro())#mro算法,告诉我们调用子类按什么顺序查找方法
    # [<class '__main__.Xw'>, <class '__main__.Lw'>, <class '__main__.Ll'>, <class 'object'>]
    xw.make_money()# 子类调用重写的方法
    xw.cook()#调用父类的方法




  • 相关阅读:
    《CMake实践》笔记二:INSTALL/CMAKE_INSTALL_PREFIX
    《CMake实践》笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE
    《CMake实践》第三部分的示例代码的错误
    利用 autoconf 和 automake 生成 Makefile 文件
    如何安装 罗技“优联技术”无线鼠标、无线键盘?
    make 和 makefile 的关系
    编译器 cc、gcc、g++、CC 的区别
    如何撤销 PhpStorm/Clion 等 JetBrains 产品的 “Mark as Plain Text” 操作 ?
    Linux/Ubuntu tree 命令以树形结构显示文件夹目录结构
    C/C++ 静态链接库(.a) 与 动态链接库(.so)
  • 原文地址:https://www.cnblogs.com/haifeima/p/12879505.html
Copyright © 2011-2022 走看看