pyton 封装
定义:在类中将方法和属性隐藏起来
一、私有化
1、格式
__名字,在名字前加双下划线
2、私有化对象
对象属性
静态属性
普通方法
3、作用
1)在类的外面不能直接调用类的方法和属性
2)类的属性值不能随意更改
3)子类不能通过继承获取父类的私有化属性和方法
4、实质
在代码层次做了变形,在类的外部仍可通过 对象名或类命_类命__名字,来调用,不推荐使
class Person:
__country = 'china' def __init__(self, name, sex, age):
self.__name = name
self.__sex = sex
self.__age = age def get_age(self):
"""
对象属性__age,私有化无法直接调用
通过get_age方法实现
:return: self.__age
"""
# print(self.__dict__)
return self.__age def set_age(self, new_age):
"""
对象属性__age,私有化无法直接修改
通过set_age方法实现,并规定属性值只能是数字
:param new_age:
:return:赋值类型不符合规定,返回的内容
"""
if new_age.isdigit():
self.__age = new_age
else:
return '输入错误,请输入年龄' class Worker(Person):
def __init__(self, name, sex, age, job):
super().__init__(name, sex, age)
self.job = job def test(self):
print(self.name) w1 = Worker('tom', 'm', '', 'joker')
print(w1.test()) # AttributeError: 'Worker' object has no attribute 'name'
p1 = Person('tom', 'm', '')
print(p1.get_age()) #
print(p1.set_age('wt')) # 输入错误,请输入年龄
print(p1.get_age()) #
p1.set_age('')
print(p1.get_age()) #
print(p1._Person__age) # 私有化的实质是在代码层次进行变形,格式p1.name-> p1._Person__name, 不推荐使用
print(Person._Person__country) # 静态属性私有化,不推荐使用
二、property
1、property是内置装饰函数,只在面向对象中使用
2、作用
方法属性,给方法加上装饰器,可以在类的外部直接调用方法名而不是调用方法名()
动词:方法,名词:属性
from math import pi class Circle:
def __init__(self, r):
self.__r = r @property # 方法->属性
def area(self):
return round(pi * pow(self.__r, 2), 2) c1 = Circle(5)
print(c1.area)
3、修改
属性私有化,在类的外部不改变该属性的调用方法
class Phone:
"""
price私有化
使用property装饰price方法,在类的外部调用,和没有私有化做比较,不会感到明显的差异
使用方法名.setter装饰同名方法,来修改
"""
def __init__(self, name, price):
self.name = name
self.__price = price @property
def price(self):
return self.__price @price.setter
def price(self, new_price):
self.__price = new_price red_mi = Phone('mi', 1500)
print(red_mi.price) #
red_mi.price = 2000 # 修改价格
print(red_mi.price) #
3、删除
不常用
class Phone:
"""
price私有化
使用property装饰price方法,在类的外部调用,和没有私有化做比较,不会感到明显的差异
使用方法名.setter装饰同名方法,来修改
"""
def __init__(self, name, price):
self.name = name
self.__price = price @property
def price(self):
return self.__price @price.setter
def price(self, new_price):
self.__price = new_price @price.deleter
def price(self):
del self.__price red_mi = Phone('mi', 1500)
print(red_mi.price) #
red_mi.price = 2000 # 修改价格
print(red_mi.price) #
del red_mi.price # 根据 del 到 price.deleter, 实质是执行price.deleter装饰器下的price方法
print(red_mi.price) # 报错,因为已经被删除
4、总结
1)property是内置装饰器
2)查
私有化属性,可以通过定义同名方法和property装饰器,而不改变在类外部的调用方法
3)改
查实现后,才能实现删
私有化属性,可以通过定义同名方法和property装饰器,而不改变在类外部的调用方法
通过同方法.setter装饰器,装饰同名方法来修改私有化属性,而不改变在类外部的修改方法
4)删
不常用
三、classmethod
类方法
作用:把一个对象方法,变成类方法,调用该方法可以直接通过类,而不需要对象
格式:有一个默认参数,cls
什么时候用到:一个方法与私有化静态属性产生联系
class Student:
__country = 'china' def __init__(self, name):
self.__name = name @property
def info(self):
return '%s is %s' % (self.__name, Student.__country) @classmethod # classmethod有一个默认参数,cls
def con(cls, new_country):
cls.__country = new_country Student.con('USA')
s1 = Student('tom')
print(s1.info) # tom is USA
四、staticmethod
静态方法
1)作用
在完全面向对象的程序中,若果一个函数,即和对象没有关系,也和类没有关系,那么就可以用staticmethod装饰该函数,作为类的静态方法
2)细节
静态方法在类的内部,在静态方法中可以直接调用类,在类的外部可以通过类名调用静态方法
class Login:
def __init__(self, name, pwd):
self.name = name
self.pwd = pwd def login(self):
if self.name == 'tom' and self.pwd == 'abc-123':
print('登录成功!') @staticmethod
def name_pwd():
name = input('请输入用户名:')
pwd = input('请输入密码:')
Login(name, pwd) # 在静态方法中可以直接调用类 Login.name_pwd() # 用类调用静态方法
类方法和静态方法小结
1、都通过类名调用
2、类方法有一个默认参数,静态方法没有
3、类方法:和静态属性有关,通过类直接调用方法,不需要通过对象
4、静态方法:和类及对象没有关系,但又是必要的方法,python可以不用(面向对象和面向函数),完全面向对象必须用
pyton 封装的更多相关文章
- [C#] 简单的 Helper 封装 -- RegularExpressionHelper
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- iOS开发之App间账号共享与SDK封装
上篇博客<iOS逆向工程之KeyChain与Snoop-it>中已经提到了,App间的数据共享可以使用KeyChian来实现.本篇博客就实战一下呢.开门见山,本篇博客会封装一个登录用的SD ...
- Ajax实现原理,代码封装
都知道实现页面的异步操作需要使用Ajax,那么Ajax到是怎么实现异步操作的呢? 首先需要认识一个对象 --> XMLHttpRequest 对象 --> Ajax的核心.它有许多的属性和 ...
- 用C语言封装OC对象(耐心阅读,非常重要)
用C语言封装OC对象(耐心阅读,非常重要) 本文的主要内容来自这里 前言 做iOS开发的朋友,对OC肯定非常了解,那么大家有没有想过OC中NSInteger,NSObject,NSString这些对象 ...
- 【知识必备】RxJava+Retrofit二次封装最佳结合体验,打造懒人封装框架~
一.写在前面 相信各位看官对retrofit和rxjava已经耳熟能详了,最近一直在学习retrofit+rxjava的各种封装姿势,也结合自己的理解,一步一步的做起来. 骚年,如果你还没有掌握ret ...
- 对百度WebUploader开源上传控件的二次封装,精简前端代码(两句代码搞定上传)
前言 首先声明一下,我这个是对WebUploader开源上传控件的二次封装,底层还是WebUploader实现的,只是为了更简洁的使用他而已. 下面先介绍一下WebUploader 简介: WebUp ...
- 封装集合(Encapsulate Collection)
封装就是将相关的方法或者属性抽象成为一个对象. 封装的意义: 对外隐藏内部实现,接口不变,内部实现自由修改. 只返回需要的数据和方法. 提供一种方式防止数据被修改. 更好的代码复用. 当一个类的属性类 ...
- CSharpGL(29)初步封装Texture和Framebuffer
+BIT祝威+悄悄在此留下版了个权的信息说: CSharpGL(29)初步封装Texture和Framebuffer +BIT祝威+悄悄在此留下版了个权的信息说: Texture和Framebuffe ...
- CSharpGL(7)对VAO和VBO的封装
CSharpGL(7)对VAO和VBO的封装 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码中包含10多个独立的Demo,更适合入门参考 ...
随机推荐
- 11-28-----vertor和list使用场景
1.vector拥有一段连续的内存空间,因此支持随机访问,如果需要高效的随机访问,而不子啊胡插入和删除的效率,使用vector, 2.list拥有一段不连续的内存空间,如果需要高效的插入和删除,而不关 ...
- Jmeter完整Demo
1:创建一个线程组 2:添加一个cookie管理器 3:设置你的信息头管理器:application/json;text/plain;charset=UTF-8 44 4:添加一个用户参数,做全局变量 ...
- JMETER+JENKINS接口测试持续集成
FIDDER+ANT+JENKINS+JMETER+SVN+tomcat接口测试集成 操作流程: 1.测试人员通过FIDDER过滤抓取接口调用信息,导出成jmx文件.(jmeter支持命令行方式调用j ...
- dotnet 删除只读文件
如果直接通过 File.Delete 删除只读文件会出现没有权限提示,可以先设置文件不是只读然后删除文件 try { File.Delete(file); } catch (UnauthorizedA ...
- C#使用SmtpClient发送邮件解决授权码配置问题
授权码,(新版邮箱在开启smtp权限设置时,会生成授权码)如果不做配置,客户端是不能发送邮件的 //指定邮箱账号和密码,需要注意的是,这个密码是你在QQ邮箱设置里开启服务的时候给你的那个授权码 Smt ...
- Ubuntu安装微信,解决deepin“版本过低”或NO_PUBKEY问题
在搜索引擎搜索Ubuntu安装微信,最多的结果是通过deepin安装 但是里面使用的deepin-for-ubuntu 安装之后微信扫码会提示版本过低 直接安装deepin.com.wechat_2. ...
- 23.logging
转载:https://www.cnblogs.com/yuanchenqi/article/5732581.html 一 (简单应用) import logging logging.debug('de ...
- 使用 Postman 测试你的 API
使用 Postman 测试你的 API Intro 最近想对 API 做一些自动化测试,看了几个工具,最后选择了 postman,感觉 postman 的设计更好一些,我们可以在请求发送之前和请求获取 ...
- TCP/IP||Traceroute
1.概述 由Van jacobson编写的工具,用于探索tcp/ip协议,使用ICMP报文和首部TTL字段,TTL字段由发送端设置一个8bit字段,初始值为RFC指定,当前值为64, 每个处理数据的路 ...
- 使用SparkSql进行表的分析与统计
# 背景 我们的数据挖掘平台对数据统计有比较迫切的需求,而Spark本身对数据统计已经做了一些工作,希望梳理一下Spark已经支持的数据统计功能,后期再进行扩展. # 准备数据 在参考文献6中下载 ...