封装、property装饰器

封装分为3种情况:封装对象的属性、封装类的属性、封装方法。

封装对象的属性:(在属性名前加双下划线__)

class Person:
def __init__(self,height,weight,name,sex):
self.__height = height #私有对象属性:不在外面调它
self.__weight = weight
self.__name = name
self.__sex = sex def bmi(self):
return self.__weight / self.__height ** 2 def tell_height(self):
print(self.__height) def tell_weight(self):
return self.__weight def set_weight(self,new_weight):
if new_weight > 20:
self.__weight = new_weight egg = Person(1.7,125,'egon',None)
egg.tell_height()#在类内调
print(egg.__dict__)#查看类内的私有属性
print(egg._Person__height)#在类外调用

通过私有属性后,我们可以更好的确保属性数值不会随意修改。

封装属性我们可以在set——weight里约束属性值得更改

class Person:
def __init__(self,height,weight,name,sex):
self.__height = height #私有对象属性:不在外面调它
self.__weight = weight
self.__name = name
self.__sex = sex def bmi(self):
return self.__weight / self.__height ** 2 def tell_height(self):
print(self.__height) def tell_weight(self):
return self.__weight def set_weight(self,new_weight):
if new_weight > 20:
self.__weight = new_weight egg = Person(1.7,125,'egon',None)
egg.tell_height()#在类内调
# print(egg.__dict__)#查看类内的私有属性
print(egg._Person__height)#在类外调用
egg.set_weight(105)
print(egg.tell_weight()) #私有属性:
# 在本类内就可以正常调用
# 在本类外就必须_类名__属性名调用,(不建议你调)

封装类的属性

class Goods:
__discount = 0.8 #类的私有属性
def __init__(self,name,price):
self.name = name
self.price = price
def goods_price(self):
return self.price * Goods.__discount banana = Goods('banana',2)
print(banana.goods_price())#类内调用
# print(Goods.__dict__)#查看类的私有属性
print(Goods._Goods__discount)#在类外调用私有属性

封装对象的方法

class Foo:
def __init__(self,height,weight):
self.height = height
self.weight = weight def tell_bmi(self):
#体重/身高的平方
return self.weight / self.__heightpow() def __heightpow(self): #私有方法
return self.height * self.height egon = Foo(1.7,125)
print(egon.tell_bmi())
print(Foo.__dict__)
print(egon._Foo__heightpow()) #类外调用方法 #私有的:类属性 对象属性 方法
#变成私有的 :__名字
#在类内都是照常使用
#在类外部就变形称为:_类名__名字 #定义私有~的原因
#不让外部的人瞎调,不让子类继承

封装的进阶

通过property装饰器把一个方法变成一个属性用

from math import pi
class Circle:
def __init__(self,radius):
self.radius = radius @property #area = property(area)
def area(self):
return pi*self.radius*self.radius @property
def perimeter(self):
return 2*pi*self.radius
c = Circle(10)
print(c.area)
print(c.perimeter)
我们调用area方法和perimeter方法就像调用属性一样

上个牛逼的代码(缓存网页的,用面向对象的方法)

from urllib.request import urlopen
class Web_page:
def __init__(self,url):
self.url = url
self.__content = None#私有对象属性 @property
def content(self): #content 内容,相当于一个属性
if self.__content: #做了一个什么转换 _Web_page__content
return self.__content
else:
self.__content = urlopen(self.url).read().decode(encoding='utf-8') #做缓存
return self.__content mypage = Web_page('http://www.baidu.com')
print(mypage.content)
print(mypage.content)

计算传入数据的值

#计算传入的数据的值
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.members = args[0]
else:
self.members = args @property
def sum(self):
return sum(self.members) @property
def average(self):
return self.sum/len(self.members) @property
def min(self):
return min(self.members) @property
def max(self):
return max(self.members)
nums = Num([1,2,3])
print(nums.sum)
# print(nums.average)
# print(nums.min)
# print(nums.max)
# num2 = Num(4,5,6)
# print(num2.sum)
# print(num2.average)
# print(num2.min)
# print(num2.max)

property装饰器(property、set、del方法)

class Goods:
__discount = 0.8 #类的私有属性
def __init__(self,name,price):
self.name = name
self.__price = price
@property
def price(self):
new_price=self.__price * Goods.__discount
return new_price
@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)

总结

#@property把一个类中的方法 伪装成属性
#obj.func()
#obj.func -->属性
#因为属性不能被修改
#@funcname.setter,来修改
#obj.func = new_value 调用的是被@funcname.setter装饰器装饰的方法 #被@property装饰的方法名必须和被@funcname.setter装饰的方法同名 #@funcname.deleter
#在执行del obj.func 的时候会调用被这个装饰器装饰的方法(同名)

 

python之面向对象进阶2的更多相关文章

  1. python基础——面向对象进阶下

    python基础--面向对象进阶下 1 __setitem__,__getitem,__delitem__ 把对象操作属性模拟成字典的格式 想对比__getattr__(), __setattr__( ...

  2. python基础——面向对象进阶

    python基础--面向对象进阶 1.isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 ...

  3. Python 3 面向对象进阶

    Python 3 面向对象进阶 一.    isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的 ...

  4. day021|python之面向对象进阶1

    面向对象进阶 目录 面向对象进阶 1 继承 1.1 继承入门 1.1.1 继承基础 1.1.2 类的基本使用 1.2 多继承 1.2.1 多继承的基本使用 1.2.2 多继承以后的重复性 1.3 类的 ...

  5. python基础-面向对象进阶

    一.什么是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被 ...

  6. python学习------面向对象进阶

    一 isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 class Foo(object) ...

  7. python开发面向对象进阶:反射&内置函数

    isinstance和issubclass isinstance(obj,cls)检查是否obj是否是类 cls 的对象或者子类的对象 class Foo(object): pass class ba ...

  8. Python之面向对象进阶------反射(Day26)

    一 classmethod class Classmethod_Demo(): role = 'dog' @classmethod def func(cls): print(cls.role) Cla ...

  9. python之面向对象进阶3

    1.isinstace和issubclass 2.staticmethod和classmethod 3.反射(hasattr.getattr.setattr.delattr等四个方法) 4.内置方法 ...

随机推荐

  1. 深度学习论文翻译解析(一):YOLOv3: An Incremental Improvement

    论文标题: YOLOv3: An Incremental Improvement 论文作者: Joseph Redmon Ali Farhadi YOLO官网:YOLO: Real-Time Obje ...

  2. 使用Asp.Net Core MVC 开发项目实践[第一篇:项目结构说明]

    先从下图看整体项目结构: Mango.Manager: 为后台管理项目 Mango.Web: 为前台项目 Mango.Framework.Core: 为常用的基础操作类项目 Mango.Framewo ...

  3. ZOJ 1456 Minimum Transport Cost(Floyd算法求解最短路径并输出最小字典序路径)

    题目链接: https://vjudge.net/problem/ZOJ-1456 These are N cities in Spring country. Between each pair of ...

  4. MongoDB框架Jongo的使用介绍

    1.Jongo可以用来做什么?   Jongo框架的目的是使在MongoDB中可以直接使用的查询Shell可以直接在Java中使用.在官网首页有一个非常简洁的例子:   SHELL:这种查询方式是Mo ...

  5. Extjs4.2+webAPI+EF实现分页以及webapi的数据传值

    由于不明白分页的总数是怎么计算,不知道他的分页方式所以花费了好多功夫,现在弄出来了与大家分享下 1.首先是EF的简历,想必大家都清楚:添加-〉新建项-〉数据-〉Ado.net实体数据模型 2.就是后台 ...

  6. php编程规范整理

    该规范对其他语言,部分是通用的标准....好吧,废话不多说啦,直入正题: 1.PHP 编程规范与编码习惯最主要的有以下几点: 1 文件说明 2 function 函数体说明 3 代码缩进 4 if省略 ...

  7. (4)Jquery1.8.3快速入门_基本选择器

    一.Jquery选择器: 基本选择器: 1.id                           #id      根据元素的id获取的唯一元素. 2.class                  ...

  8. 将javaWeb项目转maven项目

    不经常做此类转换,所以总是忘记转换方法,特此,记录下转换步骤 1.首先从SVN检出项目 2.找到导出项目路径 3.按住Shift+鼠标右键,打开控制台 3.输入命令mvn eclipse:eclips ...

  9. Mybatis关联查询之一对多和多对一XML配置详解

    平时在开发过程中dao.bean和XML文件都是自动生成的,很少写XML的配置关系,今天记录一下mybatis的关联查询中的多对一和一对多的情况. 首先是有两张表(学生表Student和老师Teach ...

  10. 自定义基于jquery竖向瀑布流插件

    公司新项目做了一个关于图片的板块,网上找了一些瀑布流插件都不是很适合自己,于是就自己造轮子写一个,并封装成插件github 于是就想分享一下,主要是为了更好的学习与记忆. 如果大家进来了,希望能给我g ...