python全栈开发【第十五篇】面向对象三大特性——封装

1.封装:

什么是封装呢?(封装不是单纯意义的隐藏,其实它还是可以查看的)

  就是把一些不想让别人看的给隐藏起来了

封装数据:目的是保护隐私

功能封装:目的是隔离复杂度

如果用了私有的,在类的外部,无法直接使用变形的属性,但是在类的内部可以直接使用

# 对象名.属性名取值的三种方法
1.用我们常用的__init__方法里的self取值
class Course:#恰好给我们提供了实现这种思路的方法
#             #一种思路,python
    def __init__(self,price,period,name):
        self.price = price
        self.period = period
        self.name = name
c = Course(2000,‘linux‘,‘6 months‘)
print(c.period)

2.在类里面定义一个空字典,然后装在字典里面取值
def course(price,name ,period):
    dic = {}
    dic[‘price‘] = price
    dic [‘name‘] = name
    dic [‘period‘] = period
    return dic

c = Course(2000,‘python‘,‘6 months‘)
print(c.period)  #对象名.属性名     查看属性的值

3.利用namedtuple方法
from collections import namedtuple  #只有属性没有方法的类
Course = namedtuple(‘Course‘,[‘name‘,‘price‘,‘period‘]) #传两个参数,第一个为自定义的名字,第二个传进去的是属性
python = Course(‘python‘,10000,‘6 moths‘)  #相当于实例化了
print(python.name)

2.封装类属性的私有属性(就是类属性前面加__)

#类属性1
class Goods:
    # 按照打八折计算 (定义了一个私有类属性)
    __discount = 0.8  #变形后:_Goods__discount
    def __init__(self,name,price):
        self.name = name
        self.price = price
    def goods_price(self):
        return  self.price * Goods.__discount
apple = Goods(‘apple‘,10)
print(apple.goods_price())
# print(Goods.__dict__)  #类名.__dict__
print(Goods._Goods__discount)
#类属性的私有方法
# 封装:把你不想让人看的隐藏起来
# 数据封装:目的保护隐私
class Teacher:
    __School = ‘oldboy‘  #类属性
    def __init__(self,name,salary):
        self.name = name
        self .__salary  =  salary  #_Teacher__salary
            # 老师的属性   值
        #怎么把薪水隐藏起来?
        self.__salary=salary
    def foo(self):
        print(‘------‘)

t=Teacher(‘egon‘,2000)
print(t.__dict__)
# print(t.name)
print(t._Teacher__salary)#让显示出来
print(Teacher._Teacher__School)  #类属性使用_类名__属性名
t.foo()
#在本类内是可以正常调用的
#在本类外就必须以_类名__属性名调用(但是不建议你调)

  

3.封装类对象的私有属性

成人的BMI数值:
过轻:低于18.5
正常:18.5-23.9
过重:24-27
肥胖:28-32
非常肥胖, 高于32
  体质指数(BMI)=体重(kg)÷身高^2(m)
  EX:70kg÷(1.75×1.75)=22.86
# 计算体质指数,衡量人健康的标准(对象的私有属性一)
class Person:
    def __init__(self,height,weight,name,sex):
        self.__height = height  #私有属性(让你不再外面调它)
                                # 在本类中可以调用,在类外就不可以调用了
        self.__weigth = weight
        self.__name = name
        self.__sex = sex
    def tell_bmi(self):  #体重指数
        return self.__weigth/self.__height ** 2  #在本类中可以调用

    def tell_height(self):
        print(self.__height)
    def tell_weight(self):  #告诉体重
        return  self.__weigth
    def set_weigth(self,new_weight):   #修改体重
        if new_weight >20:
             self.__weigth = new_weight
        else:
            raise TypeError(‘你也太瘦了,瘦的连斤数都(快)没了‘)   #如果体重小于20或者负的,就主动提示一个报错
egg = Person(1.6,96,‘haiyan‘,‘female‘)
print(egg.tell_bmi())
# egg.__height #在类外不能调用
# print(egg._Person__height)  #在类外查看得这样调用
print(egg.__dict__)  #查看变形后的类型
# egg.set_weigth(-10)
# print(egg.tell_weigth())
egg.set_weigth(66)  #修改体重为66
print(egg.tell_weight())
# 对象属性的私有属性二
class People:
    def __init__(self,name,age,sex,height):
        self.__name = name
        self.__age = age
        self.__sex = sex
        self.__height = height

    def tell_name(self):  #看人名字
        print(self.name)
    def set_name(self,val): #修改名字
        if not isinstance(val, str):
            raise TypeError(‘名字必须是字符串类型‘)
        self.__name = val
    def tell_info(self):
         print(‘‘‘
           ---------%s info-----------
           name:%s
           age:%s
           sex:%s
           height:%s‘‘‘%(self.__name,self.__name,self.__age,self.__sex,self.__height))

p=People(‘egon‘,21,‘male‘,‘180‘)
p.tell_info()
p.set_name(‘haiyan‘)   #调用修改名字的方法
p.tell_info()
# print(p._People__name)#就可以看到了

  

4.封装类方法的私有属性  

类方法的私有属性1
# 方法的私有属性
class Parent:
    def __init__(self):
        self.__func()  #__func==_Parent__func
    def __func(self):
        print(‘Parent func‘)

class Son(Parent):
    def __init__(self):
        self.__func()  #_Son__func
    def __func(self):
        print(‘Son func‘)

    def _Parent__func(self):
        print(‘son _Parent__func‘)
s = Son()
print(Parent.__dict__)  #类名.__dict__查看变形后的结果

# 私有属性:在本类内是可以正常调用的
#           在本类外就必须以_类名__属性名调用(但是不建议你调)
#方法的私有属性2
class Foo:
    def __func(self):
        print(‘from foo‘)
class Bar(Foo):
    def __func(self):
        print(‘from bar‘)
b = Bar()
b._Foo__func()
b._Bar__func()
#装饰方法的私有属性3
class Foo:
    def __init__(self,height,weight):
        self.height = height
        self.weight = weight
    def __heightpow(self):  #私有方法
        return self.height * self.height
    def tell_bmi(self):
        return self.weight/self.__heightpow()

egon = Foo(1.7,120)
print(egon.tell_bmi())
print(Foo.__dict__)
print(egon._Foo__heightpow())  #虽说是私有的,但是还是可以查看的

 5.property

为什么要用property:将一个类的函数定义成特性以后,对象再去使用的时候obj.name,根本无法察觉自己的name是执行了一个函数然后计算出来的,这种特性的使用方式遵循了统一访问的原则

1.计算圆的面积和周长

from math import pi
class Circle:
    def __init__(self,radius):
        self.radius = radius
    @property  #装饰器:把一个方法当成一个属性用了
    def area(self):
        return self.radius * self.radius* pi
    @property
    def peimeter(self):
        return 2*pi*self.radius

c = Circle(10)
print(c.area)  #当成一个属性来调了,就不用加括号了
print(c.peimeter)

2.缓存网页信息

from urllib.request import urlopen
class Web_page:
    def __init__(self,url):
        self.url = url
        self.__content = None  #内容设置为None
    @property
    def content(self):
        if self.__content:  #如果不为空,就说明已经下载了  _Web_page__content
            return self.__content
        else:
            self.__content = urlopen(self.url).read()#做缓存
            return self.__content
mypage = Web_page(‘http://www.baidu.com‘)
print(mypage.content)
print(mypage.content)
print(mypage.content)

3.求和,平均值,最大值,最小值

class Num:
    def __init__(self,*args):
        print(args)
        if len(args)==1 and (type(args[0]) is list or type(args[0]) is tuple):
            self.numbers=args[0]
        else:
            self.numbers = args

    @property
    def sum(self):
        return sum(self.numbers)

    @property
    def avg(self):
        return self.sum/len(self.numbers)

    @property
    def min(self):
        return min(self.numbers)

    @property
    def max(self):
        return max(self.numbers)
num = Num([3,1,3])
vvv = Num(8,2,3)
print(num.sum)
print(num.min)
print(num.avg)
print(num.max)
print(‘-----------‘)
print(vvv.sum)
print(vvv.min)
print(vvv.avg)
print(vvv.max)

6.setter

#买东西
class Goods:
    __discount = 0.8  #类的私有属性
    def __init__(self,name,price):
        self.name = name
        self.__price = price

    @property
    def price(self):
        # if hasattr(self,‘__price‘):
            return self.__price * Goods.__discount
        # else:
        #     raise NameError

    @price.setter
    def price(self,new_price):
        if type(new_price) is int:
            self.__price = new_price

    @price.deleter
    def price(self):
        del self.__price

apple = Goods(‘apple‘,10)
# print(apple.price)
apple.price = 20
print(apple.price)

# del apple.price
# print(apple.price)
# apple.set_price(20)
# apple._Goods__apple
@property把一个类中的方法 伪装成属性原来是obj.func()现在是obj.func  -->属性1.因为属性不能被修改所以用了@funcname.setter
obj.func = new_value 调用的是被@funcname.setter装饰器装饰的方法被@property装饰的方法名必须和被@funcname.setter装饰的方法同名2.也可以另一种方法修改,但是上一种方法吧一个类中的方法伪装成属性来调用了,而这种方法还是原来实例化一样调用例如:
class People:
    def __init__(self,name,age,sex,height):
        self.__name = name
        self.__age = age
        self.__sex = sex
        self.__height = height

    def tell_name(self):  #看人名字
        print(self.name)
    def set_name(self,val): #修改名字
        if not isinstance(val, str):
            raise TypeError(‘名字必须是字符串类型‘)
        self.__name = val
    def tell_info(self):
         print(‘‘‘
           ---------%s info-----------
           name:%s
           age:%s
           sex:%s
           height:%s‘‘‘%(self.__name,self.__name,self.__age,self.__sex,self.__height))

p=People(‘egon‘,21,‘male‘,‘180‘)
p.tell_info()
p.set_name(‘haiyan‘)   #调用修改名字的方法
p.tell_info()
# print(p._People__name)#就可以看到了

  

原文地址:https://www.cnblogs.com/xiaohema/p/8453697.html

时间: 2024-07-30 20:52:44

python全栈开发【第十五篇】面向对象三大特性——封装的相关文章

python全栈开发【第五篇】Python可变数据类型和不可变数据类型

1.可变数据类型:在id不变的情况下,value可改变(列表和字典是可变类型,但是字典中的key值必须是不可变类型) 2.不可变数据类型:value改变,id也跟着改变.(数字,字符串,布尔类型,都是不可类型) 原文地址:https://www.cnblogs.com/xiaohema/p/8452966.html

Python全栈开发记录_第一篇

Python全栈开发记录只为记录全栈开发学习过程中一些难和重要的知识点,还有问题及课后题目,以供自己和他人共同查看.(代码行数:70行) 知识点1:优先级:not>and 短路原则:and:如果第一个条件的结论为假,那么 and 前后两个条件组成的表达式计算结果一定为假,后面的条件计算机不会进行计算 or:如果第一个条件的结论为真,那么or 前后两个条件组成的表达式计算结果一定为真,后面的条件计算机不会进行计算 知识点2:python区分大小写,常量需全部字母大写(默认这样写) python换行

Python全栈开发记录_第九篇(类的基础_封装_继承_多态)

有点时间没更新博客了,今天就开始学习类了,今天主要是类的基础篇,我们知道面向对象的三大特性,那就是封装,继承和多态.内容参考该博客https://www.cnblogs.com/wupeiqi/p/4493506.html 之前我们写的都是函数,可以说是面向过程的编程,需要啥功能就直接写啥,但是我们在编写程序的过程中会发现如果多个函数有共同的参数或数据时,我们也必须多次重复去写,此时如果用面向对象的编程方式就会好很多,这也是面向对象的适用场景. 面向对象三大特性: 一.封装(顾名思义就是将内容封

python全栈开发【第四篇】Python流程控制

十二 流程控制之if-else 既然我们编程的目的是为了控制计算机能够像人脑一样工作,那么人脑能做什么,就需要程序中有相应的机制去模拟.人脑无非是数学运算和逻辑运算,对于数学运算在上一节我们已经说过了.对于逻辑运算,即人根据外部条件的变化而做出不同的反映,比如 1 如果:女人的年龄>30岁,那么:叫阿姨 age_of_girl=31 if age_of_girl > 30: print('阿姨好') 2 如果:女人的年龄>30岁,那么:叫阿姨,否则:叫小姐 age_of_girl=18

python全栈开发【第十三篇】Python面向对象

一.面向过程:面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优点:极大地降低了写成学的复杂度,只需要顺着执行的步骤,堆叠代码即可 缺点:一套流水线或者流程就是用来解决一个问题,如果修改代码就都得改变 二.面向对象:上帝的思想 优点:解决了程序的扩展性.对某一个对象单独修改,会立刻反映到整个体系中,如对游戏中一个人物参数的特征和技能修改都很容易. 缺点:可控性差,无法向面向过程的程序设计流水线式的可以

python全栈开发【第六篇】Python字符编码

1.内存和硬盘都是用来存储的. CPU:速度快 硬盘:永久保存 2.文本编辑器存取文件的原理(nodepad++,pycharm,word) 打开编辑器就可以启动一个进程,是在内存中的,所以在编辑器编写的内容也都是存放在内存中的,断电后数据就丢失了.因而需要保存在硬盘上,点击保存按钮或快捷键,就把内存中的数据保存到了硬盘上.在这一点上,我们编写的py文件(没有执行时),跟编写的其他文件没有什么区别,都只是编写一堆字符而已. 3.python解释器执行py文件的原理,例如python  test.

python全栈开发【第七篇】Python文件操作

一.文件处理流程 1.打开文件,得到文件句柄并赋值给一个变量 2.通过句柄对文件进行操作 3.关闭文件 r模式,默认模式,文件不存在则报错 w模式,文件不存在则创建,文件存在则覆盖 a模式,文件不存在则创建,文件存在则不会覆盖,写内容会以追加的方式写(写日志文件的时候常用),追加模式是一种特殊的写模式 b(rb,wb,ab)模式:不用加encoding:utf-8 f=open('c.txt','rb') # print(f.read()) print(f.read().decode()) f=

python全栈开发【第十一篇】Python常用模块三(hashlib,configparser,logging)

hashlib模块 hashlib提供了常见的摘要算法,如md5和sha1等等. 那么什么是摘要算法呢?摘要算法又称为哈希算法.散列算法.它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示). 注意:摘要算法不是一个解密算法.(摘要算法,检测一个字符串是否发生了变化) 应涂:1.做文件校验 2.登录密码 密码不能解密,但可以撞库,用'加盐'的方法就可以解决撞库的问题.所有以后设置密码的时候要设置的复杂一点. #用户密码 import hashlib # md5

python全栈开发【第十七篇】面向对象反射和内置方法

一.静态方法(staticmethod)和类方法(classmethod) 类方法:有个默认参数cls,并且可以直接用类名去调用,可以与类属性交互(也就是可以使用类属性) 静态方法:让类里的方法直接被类调用,就像正常调用函数一样 类方法和静态方法的相同点:都可以直接被类调用,不需要实例化 类方法和静态方法的不同点: 类方法必须有一个cls参数表示这个类,可以使用类属性 静态方法不需要参数 绑定方法:分为普通方法和类方法 普通方法:默认有一个self对象传进来,并且只能被对象调用-------绑定

python全栈开发【第三篇】Python运算符

计算机可以进行的运算有很多种,不只是加减乘除,它和我们人脑一样,也可以做很多运算. 种类:算术运算,比较运算,逻辑运算,赋值运算,成员运算,身份运算,位运算,今天我们先了解前四个. 算术运算: a=10,b=20 赋值运算: 比较运算: 逻辑运算:   原文地址:https://www.cnblogs.com/xiaohema/p/8452952.html