【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()#调用父类的方法

 





 

posted @ 2020-05-12 23:02  柠檬不萌!  阅读(568)  评论(0编辑  收藏  举报
浏览器标题切换
浏览器标题切换end