封装、property特性及绑定与非绑定方法
1、封装
(1)什么是封装?
封:属性对外是隐藏的,但对内是开放的;
装:申请一个名称空间,往里面装入一系列名字/属性
(2)为什么要封装?
封装数据属性的目的
首先定义属性的目的就是为了给类外部的使用者使用的
隐藏之后是为了不让外部使用直接使用,需要类内部开辟一个接口
然后让类外部的使用通过接口来间接的操作隐蔽的属性
精髓在于:我们可以在接口之上附加任意逻辑,从而严格严格控制使用者对属性的操作;
封装函数属性
首先定义属性的目的就是为了给类外部的使用使用的
隐藏函数属性是为了让使用者不直接使用,在类内部开辟一个接口,在接口内部调用隐蔽的功能
精髓在于:隔离了复杂度
(3)如何封装
如何隐藏:在属性前加上__开头
1、这种隐藏仅仅只是一种语法上的变形操作;
2、这种语法上的变形只是在类定义阶段发生一次,因为类体代码仅仅只在类定义阶段检测一次;
3、这种隐藏是对外不对内的,即在类的内部可以直接访问
,而在类的外部则无法直接访问,原因是在类定义阶段,类体代码统一发生了一次变形
(4)、如果不想让子类的方法覆盖父类的,可以将该方法名前加上一个__开头
如何隐藏
# class people:
# __country= 'china' # 在要隐藏的属性前加上__
# def __init__(self,name,age,sex):
# self.__name= name #在定义阶段代码发生了变形 self._people__name= name
# self .age= age
# self .sex= sex
#
# def eat(self):
# print('eat....')
# print(people .__country ) #在类内部可以访问 # peo= people('egon',18,'male')
#people .__country #在类外部无法访问
# print(people.__dict__ )
#隐藏的原理:在类定义阶段属性名__country 变成了_people__country
# print(people._people__country) #这样是可以访问到隐藏后的属性的
如果不想让子类的方法覆盖父类的,可以将该方法名前加上一个__开头
class Foo:
def __f1(self): #_Foo_f1
print('Foo.f1') def f2(self):
print('Foo.f2')
self .__f1() #self._Foo_f1 class Bar(Foo):
def __f1(self): #_Bar_f1
print('Bar.f1')
#print(Bar.mro())
obj = Bar()
obj.f2()
2、Property 装饰器
property装饰器用于将被装饰的方法伪装成一个数据类型,在使用时不用加括号而直接引用
class people:
def __init__(self,name):
self.__name= name @property #伪装成数据属性查看
def name(self):
return self .__name @name.setter #在原来函数name上进行修改操作
def name(self,name):
if type(name) is not str:
print('名字必须是str类型')
self .__name= name #把原来的属性self.__name改成name @name.deleter #删去操作
def name(self):
#print('不让删')
del self.__name peo= people ('qqc') #建对象 # print(peo.name) #查看
peo.name= 'QQC' #修改操作
print(peo.name)
# del peo.name #删除操作
# print(peo.__dict__ )
3、绑定方法与非绑定方法
(1)绑定方法
特性:绑定给谁就应该由谁来调用,谁里啊调用就会将谁当做第一个参数自定传入
注:自动传值
绑定方法分为两类:
1.1 绑定给对象的方法
在类内部定义的函数(没有被任何装饰器修饰的),默认就是绑定给对象用的
1.2 绑定给类的方法
在类内部定义的函数如果被装饰器@classmethod装饰,
那么则是绑定给类的,应该由类来调用,类来调用就自动将类当做第一个参数自动传入
(2)非绑定方法
类中定义的函数如果被装饰器@staticmethod装饰,那么该函数就变成非绑定方法
即不与类绑定,又不与对象绑定,意味着类与对象都可以来调用
但是无论谁来调用,都没有任何自动传值的效果,就是一个普通函数
应用:
函数体代码需要用外部传入的类,则应该将该函数定义成绑定给类的方法;
函数体代码需要用外部传入的对象,则应该将该函数定义成绑定给对象的方法;
如果函数体代码即不需要外部传入的类也不需要外部传入的对象,则应该将该函数定义成非绑定方法/普通函数
#绑定方法
class Foo:
@classmethod
def f1(cls):
print(cls)
def f2(self):
print(self) obj = Foo()
# print(obj.f2)
#1、f1是绑定给类的,应该由类来调用,但其实对象也可以调用,但自动传入的参数仍然是类
# Foo.f1()
#2、f2是绑定给对象的
# obj.f2()
例子:从配置文件中实例化
import settings
class mysql:
def __init__(self,ip,port):
self.ip= ip
self.port= port def tell_info(self):
print(self.ip ,self .port) @classmethod
def from_conf(cls): #与类绑定,自动传入类
return mysql(settings.IP,settings.PORT) @staticmethod #非绑定方法,无自动传值
def func():
print('不与任何人绑定') #默认实例化方式:类名(。。。)
obj= mysql('10.10.0.9',3307) #一种新的实例化方式,从配置文件中读取配置完成实例化
obj1= mysql.from_conf()
obj1.tell_info()
obj1.func()
封装、property特性及绑定与非绑定方法的更多相关文章
- python 类的封装/property类型/和对象的绑定与非绑定方法
目录 类的封装 类的property特性 类与对象的绑定方法与非绑定方法 类的封装 封装: 就是打包,封起来,装起来,把你丢进袋子里,然后用绳子把袋子绑紧,你还能拿到袋子里的那个人吗? 1.隐藏属性和 ...
- python面向编程;类的绑定与非绑定方法、反射、内置方法
一.类的绑定与非绑定方法 ''' 类中定义函数分为了两大类: 1. 绑定方法 特殊之处: 绑定给谁就应该由谁来调用,谁来调用就会将谁当做第一个参数自动传入 绑定给对象的方法: 在类中定义函数没有被任何 ...
- Day08:继承与派生,多态,封装,绑定与非绑定方法,面向对象高级(反射,__str__,__del__)
上节课复习:1.编程思想 面向过程 核心是过程二字,过程指的是解决问题的步骤,即先干什么再干什么后干什么 基于该思想编写程序就好比在设计一条流水线,是一种机械式的思维 ...
- day 26-1 property、绑定与非绑定方法
property property是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值:就是把一个函数属性的访问方式变成像访问数据属性的方式一样. 我们首先来看一个对比效果 例一:在调用 bmi ...
- python 面向对象(类的成员,属性,绑定和非绑定,)
面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使用(可以讲多函数中公用的变量封装到对象中) 对象,根据模板创建的实例(即:对象),实 ...
- 绑定与非绑定方法及反射,isinstance和issubclass内置函数
目录 绑定方法与非绑定方法 1.绑定方法 2.非绑定方法(staticmethod) isinstance和issubclass 内置函数 1.isinstance 2.issubclass 反射(面 ...
- CSIC_716_20191128【多态、绑定与非绑定方法、isinstance与issubclass 】
多态 what: 同一个事物有不同的形态. 多态的目的:在不知道对象具体类型的情况下,统一对象调用方法的规范.(通俗讲,即规定实现同样功能的方法,一定要起同样的名字). 多态的表现形式之一就是继承,先 ...
- 绑定与非绑定以及property装饰器_day_21 作业题
1.定义MySQL类 1.对象有id.host.port三个属性 2.定义工具create_id,在实例化时为每个对象随机生成id,保证id唯一 3.提供两种实例化方式,方式一:用户传入host和po ...
- bound和unbound方法,类的绑定和非绑定是什么
作者:灵剑链接:https://www.zhihu.com/question/41006598/answer/148994582来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...
随机推荐
- Centos7上配置网络和本地yum方法
配置网络yum源 前提:1.这个系统能上网 2.vim /etc/resolv.conf nameserver 8.8.8.8 nameserver 114.114.114.114 操作如下: 1.m ...
- 给servlet类添加源代码
1.按住ctrl键不放.鼠标左键点击HttpServlet. 2.打开 https://mvnrepository.com/下载所需的jar包,要下载带-sources后缀的 3.点击按钮附加源代码 ...
- 正则re模块
正则表达式的特殊字符: 语法: re.match(正则语法,字符串) # re.match() 为关键字 group(1) # 取出第一个匹配 括号中的值,1位第一个括号内的值 1. 特殊字符 1 . ...
- 萨塔尼亚的期末考试(fail)
题解: 这题比较妙啊... 首先暴力自己算是找不出规律的 有一种直觉就是可以把式子变成{f[1]+...f[n]}+{f[2]+...+f[n]}+{f[3]+...+f[n]}... 然后看了题解发 ...
- 在grails中远程调用action
在进行类似批处理的程序时,如果在一个action中需要保存很多记录数,这会导致grails中的数据库session超过负荷,从而导致OOM. 因为这个情况的发生是由于在一次请求中,对数据进行的修改都保 ...
- 堆排序算法(Java实现)
将待排序的序列构造成一个大顶堆(从大到小排要构造成小顶堆).此时,整个序列的最大值就是堆顶的根节点,将他和末尾元素交换,然后将剩余的length-1个节点序列重新构造成新的堆.重复执行,便能得到一个有 ...
- day 58 bootstrap part2
bootstrap组件的官网, https://v3.bootcss.com/components/#page-header 在bootstrap里面出了HTML和css样式之外还有很多的辅助工具,我 ...
- 为表格动态添加一行,miniui组件无效
想要使用miniui实现这样的功能,点击按钮,在一个<td>中动态添加一个miniui输入框和一个按钮,结果miniui的样式无法渲染,请问这种问题可以怎么解决代码如下: <tr&g ...
- 初窥Java之一
一.常用的dos命令 打开命令提示符窗口的方式: ① win + R --> 输入cmd --> 回车 ② 开始 --> 搜索程序和文件的框中输入 cmd --> 回车 ③ ...
- 使用PHPStorm 配置自定义的Apache与PHP环境
使用PHPStorm 配置自定义的Apache与PHP环境之一 关于phpstorm配置php开发环境,大多数资料都是直接推荐安装wapmserver.而对于如何配置自定义的PHP环境和Apach ...