python-面向对象精髓-组合-封装

一、面向对象精髓

"""
host = '127.0.0.1'
port = 3306
db = 'db1'
charset = "utf-8"
# 在没有学习类这个概念时,数据与功能是分离的
def exc1(host,port,db,charset,sql):
    conn=connect(host,port,db,charset)
    conn.execute(sql)
    return 123

def exc2(host,port,db,charset,proc_name):
    conn=connect(host,port,db,charset)
    conn.call_proc(proc_name)
    return 123
exc1('127.0.0.1',3306,'db1','utf8','select * from tb1;')
exc2('127.0.0.1',3306,'db1','utf8','存储过程的名字')

"""
class Mysql:

    def __init__(self,host,port,db,charset):
        self.host = host
        self.port = port
        self.db = db
        self.charset = charset

    def exc2(self,proc_name):
        conn=connect(self.host,self.port,self.db,self.charset)
        conn.call_proc(proc_name)
        return 123

    def exc1(self,sql):
        conn=connect(self.host,self.port,self.db,self.charset)
        conn.execute(sql)
        return 123


my1 = Mysql("127.0.0.1",3306,"mydb","utf-8")

my1.exc1("select *from table1")
my1.exc2("名字")
#精髓是将数据和处理数据的代码绑定成了一个对象
#只要获取到对象,相应的数据和方法都有了

二、组合

  1. 什么叫组合:多个对象放在一起叫组合
  2. 组合的好处:可以降低代码的冗余
class Person:
    def __init__(self,name,sex,age):
        self.name = name
        self.sex = sex
        self.age = age
class Student(Person):
    def __init__(self,name,sex,age,number):
        super().__init__(name, sex, age)
        self.number = number

    def show_info(self):
        print(self.__dict__)

    def select_cursor(self):
        print("%s 正在选课...." % self.name)

class Teacher(Person):
    def __init__(self,name,sex,age,salary,level):
        super().__init__(name,sex,age)
        self.salary = salary
        self.level = level
    def set_score(self):
        print("%s 正在为学生打分..." % self.name)
        
stu = Student("张三", "男", 20, "一班")
stu.show_info()

#上述代码通过继承减少了代码冗余
#需要给学生添加手机这个属性(手机号码,运营商,归属地,可以打电话)
======================================================================
class Person:
    def __init__(self,name,sex,age,phonenumber,operator,address):
        self.name = name
        self.sex = sex
        self.age = age

        self.phonenumber = phonenumber
        self.operator = operator
        self.address = address

    def call(self):
        print("%s 正在拨号" % self.phonenumber)


class Student(Person):
    def __init__(self,name,sex,age,number,phonenumber,operator,address):
        super().__init__(name, sex, age,phonenumber,operator,address)
        self.number = number

    def show_info(self):
        # print("name:%s sex:%s, age:%")
        print(self.__dict__)

    def select_cursor(self):
        print("%s 正在选课...." % self.name)

class Teacher(Person):
    def __init__(self,name,sex,age,salary,level,phonenumber,operator,address):
        super().__init__(name,sex,age,phonenumber,operator,address)
        self.salary = salary
        self.level = level
    def set_score(self):
        print("%s 正在为学生打分..." % self.name)

stu = Student("张三","男",20,"1号","18666666666","中国联通","黑龙江")
stu.show_info()
stu.call()
#上述代码通过继承减少了代码冗余
#需要给学生添加手机这个属性(手机号码,运营商,归属地,可以打电话)
#需要给学生添加电脑这个属性(品牌,系统,CPU,内存,可以看视频,打游戏)
=================================================================
class Phone:
    def __init__(self,phonenumber,operator,address):
        self.phonenumber = phonenumber
        self.operator = operator
        self.address = address

    def call(self):
        print("%s 正在拨号" % self.phonenumber)


class Person:
    def __init__(self,name,sex,age):
        self.name = name
        self.sex = sex
        self.age = age


class Student(Person):
    def __init__(self,name,sex,age,number):
        super().__init__(name, sex, age)
        self.number = number

    def show_info(self):
        # print("name:%s sex:%s, age:%")
        print(self.__dict__)

    def select_cursor(self):
        print("%s 正在选课...." % self.name)

class Teacher(Person):
    def __init__(self,name,sex,age,salary,level):
        super().__init__(name,sex,age)
        self.salary = salary
        self.level = level
    def set_score(self):
        print("%s 正在为学生打分..." % self.name)


stu = Student("张三","男",38,"007")
# 学生买了一台手机 所以增加一个手机属性
p1 = Phone("1999999999","中国移动","上海浦东")
stu.phone = p1
# 学生要打电话
stu.phone.call()
#通过将手机对象和学生对象进行组合,完成了需求,并且相比较继承而言
#耦合度低手机和学生在修改的时候互不影响
#同时也减少了代码冗余

组合练习:

"""
 用代码描述乐队,一个乐队有其他多个乐器组成,主唱
 乐队可以演奏歌曲

 主唱是歌手类:有名字,会唱歌
 乐器是钢琴类:能弹奏,有价格,牌子
"""
class Band:
    def __init__(self,name,singer,piano):
        self.name = name
        self.singer = singer
        self.piano = piano


    def play_music(self):
        print("hello 我们%s 组合! 请欣赏" % self.name)
        self.singer.singing()
        self.piano.playing()
class Singer:
    def __init__(self,name):
        self.name = name

    def singing(self):
        print("你好我是歌手 ",self.name)

class Piano:
    def __init__(self,price,brand):
        self.price = price
        self.brand = brand

    def playing(self):
        print("正在弹琴.....")

# 发现一个歌手
singer = Singer("王俊元")
# 买一台钢琴
p = Piano("10000","亚麻黑")

# 组件乐队
b = Band("TFBoyss",singer,p)

# 开演唱会
b.play_music()

三、封装

  1. 什么是封装:生活中的封装,类似工厂拿个纸箱,装入一堆产品,拿胶带封起来。在程序中,封装指的是将内容隐藏起来,在面向对象中有什么内容可以被隐藏?就是属性和方法

    注意:封装绝对不是单纯的隐藏,封装是指隐藏内容实现细节,对外提供使用接口

  2. 为什么要封装:

    1. 提高安全性(例如:cpu频率 缓冲区大小,电脑,手机,汽车,收音机)

      对于封装属性而言,是通过给访问和修改增加额外的逻辑判断来实现的

    2. 封装是为了明确区分内部和外部

  3. 如何使用封装:

    在属性或方法名称前加上两个下划线就可以将其设置为私有的

    属性的封装,通过需要提供相应的设置器和访问器

    python中权限只有两种,公开的(谁都可以访问)和私有的(只有自己可以访问)

  4. 封装什么时候用:当一个类中有某些属性或方法不应该让外界直接访问,那就应该将其进行封装

  5. 封装的实现原理:本质上python并没有强行限制你的访问,而是通过语法转换来实现的封装

    会将__开头的属性 转化为 _类名__属性名

  6. 封装的特点:被隐藏的内容在内部是可以直接访问,外部无法访问。子类无法覆盖和访问父类的私有属性和方法

class Student:
    def __init__(self,name,sex,age,idCard):
        self.name = name
        self.age = age
        self.sex = sex
        self.__idCard = idCard
    def say_hi(self):
        print("hello i am %s age is : %s sex is %s" %
              (self.name,self.age,self.sex))

    def test(self):
        print(self.__idCard)

    # 可以使用方法 将内部封装的内容返回出去
    def get_idCard(self):
        return self.__idCard

    # 如果直接返回的话 就没必要设置隐藏了 ,谁都可以通过调用方法来获取,我们再方法中加上自己的判断逻辑
    def get_idCard2(self,pwd): # 如果密码正确我就给你身份证号码
        if pwd == "1111":
            return self.__idCard
        else:
            print("滚 你没有资格知道我的身份证...")

    def set_idCard(self,pwd,new_idCard): # 如果密码正确就允许修改
        if pwd == "1111":
            self.__idCard = new_idCard
        else:
            print("滚 你没有资格修改我的身份证...")

stu = Student("张三","男",20,"3206661998445132")
stu.say_hi()

# 身份证填错了要修改
# stu.__idCard = "123" # 这样是无法修改原来的身份证信息的 而是添加了新的属性
# print(stu.__idCard)
# print(stu.get_idCard2("1111"))

#调用方法来修改隐藏的属性
stu.set_idCard("1111","xxxxxxxxxxxxxxxxxx")
print(stu.get_idCard2("1111"))

总结:对于被隐藏的属性、访问、和修改都需要通过方法,get用于获取 ,set用于设置(也称之为设置器和访问器)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值