封装和 property方法
封装其实就是一个类用双下划线把自己的属性或者方法给限制住 不让其他的类直接调用或者修改 必须通过这个类来进行操作,这个类通过双下划线__把自己的属性和方法给限制住了
封装就是私有的过程 把父类中的属性和方法用双下划线__给装饰后就是只能这个类中使用了 你想使用的需要这个父类名或者super()来掉用 字类不可以继承这个方法或属性了 但是在python解释器中 你私有的过程它的存储是以_类名__私有的内容 来存储的
当你的代码中遇到__名字 python解释器就会自动把它转化为_类名__名字的内容
当你私有的过程你在内存中的存储会以_类名__你私有的方法或者属性名存储 你在外部不可以直接的调用
父类私有的属性或者方法你子类无法继承:
class D(object):
def __init__(self, name, sex):
self.name = name
self.__sex =sex
def __func(self):
print('in D')
class E(D): #E继承D
def func1(self):
print(111) d = D('ni', 'hao')
e = E ('说', '不') #因为继承了父类的init方法你需要给继承的init方法传递参数 已经默认继承了 会自动给你的对象的内存空间内分配init内的属性
e.__func() #调用父类方法 这肯定会报错因为父类的方法已经给私有了你不可以调用的
class D(object):
def __init__(self, name, sex):
self.name = name
self.__sex =sex
def __func(self):
print('in D')
d = D('ni', 'hao')
print(d.__dict__) #大家看到没有 私有的属性会自动改成_类名__属性名存储起来
# d._D__func() #一定不可以这个样你这样是错误的写法 因为大家都不这样写 你这样写就会直接被公司pass
# 在类中,静态属性,方法,对象属性都可以变成私有的,只需要在这些名字之前加上__
# class D:
# def __func(self): # '_D__func'
# print('in func')
#
# class E(D):
# def __init__(self):
# self.__func() # '_E__func'
# e = E()
给大家来两道面试题 掌握了它你就掌握了封装:

上一题就是:
# 私有的名字,在类内使用的时候,就是会变形成_该类名__方法名
# 以此为例 :没有双下换线会先找E中的func
# 但是有了双下划线,会在调用这个名字的类D中直接找_D__func
property方法:
这是一个可以让你使用的时候省略方法的括号的方法 你引用这个类似于装饰器的方法
就好比你在调用方法的时候需要加上括号 但是你用了这个类似于装饰器的方法修饰后就不会这样了 只选哟类名.方法名 不需要加括号
class Person(object):
def __init__(self, name, weight,height):
self.name = name
self.__weight = weight
self.__height = height
@property
def add(self):
return self.__weight/self.__height**2 p =Person('alex', 78,1.8)
# print(p.add) # 因为被property装饰过后就不需要加括号了
print(p.__dir__())
将一个方法伪装成一个属性
并不会让你的代码有什么逻辑上的提高
只是从调用者的角度上换了一种方式,使之看起来更合理
class Person:
def __init__(self, name):
self.__name = name
@property
def name(self):
return self.__name
def set_name(self, new_name):
if type(new_name) is str :
self.__name = new_name
else :
print('您提供的数据类型不合法')
p = Person('alex')
print(p.name)
# p.set_name(123)
p.set_name('老昂')
print(p.name)
@classmethod 把你的方法变成类方法 可以能用类名来调用和用对象名来调用 如果你用对象来调用的时候只是你对象的内存空间该变 你用类来调用是所有的都改变
下面就是可以把私有的属性全局都修改 然后所有的都改变
class Goods:
__discount = 0.8
def __init__(self, name, orange_price):
self.name = name
self.__price = orange_price
@property
def price(self):
return self.__price*Goods.__discount
@classmethod
def change_discount(cls, new_discount): # 类方法 可以直接被类调用 不需要默认传对象参数 只需要传一个类参数就可以了
cls.__discount = new_discount
Goods.change_discount(4)#不依赖对象的方法 就应该定义成类方法 类方法可以任意的操作类中的静态变量
apple = Goods('apple', 5) print(apple.price)
@staticmethod
当一个方法要使用对象的属性时 就是用普通的方法
当一个方法要使用类中的静态属性时 就是用类方法
当一个方法要既不使用对象的属性也不使用类中的静态属性时,就可以使用staticmethod静态方法 def login():
user= input('user :')
if user == 'alex':print('success')
else :print('faild') login()
class Student:
def __init__(self,name):pass @staticmethod
def login(a): # login就是一个类中的静态方法 静态方法没有默认参数 就当成普通的函数使用即可
user = input('user :')
if user == 'alex':
print('success')
else:
print('faild') Student.login(1) 完全面向对象编程
先登录 后 实例化
还没有一个具体的对象的时候 就要执行login方法 使用什么样的方法要看具体用到了哪些名称空间中的变量
当一个方法要使用对象的属性时 就是用普通的方法
当一个方法要使用类中的静态属性时 就是用类方法
当一个方法要既不使用对象的属性也不使用类中的静态属性时,就可以使用staticmethod静态方法
封装和 property方法的更多相关文章
- python's twenty-second day for me 封装,property方法
面对对象的三大特性:继承,多态,封装. 函数和属性装到了一个非全局的命名空间----封装. 封装: 在类中,静态属性,方法,对象属性都可以变成私有的,只需要在这些名字前加上‘__’(双下划线). 在类 ...
- 高封装的property方法
class Person(): def __init__(self): self.__age = 0 def set_age(self, age): if age < 0 or age > ...
- 类的封装,property特性,类与对象的绑定方法和非绑定方法,
类的封装 就是把数据或者方法封装起来 为什么要封装 封装数据的主要原因是:保护隐私 封装方法的主要原因是:隔离复杂度(快门就是傻瓜相机为傻瓜们提供的方法,该方法将内部复杂的照相功能都隐藏起来了,比如你 ...
- 封装之property,多态,鸭子类型,classmethod与staticmethod
一.封装之Property prooerty是一种特殊的属性,访问时他会执行一段功能(函数)然后返回 '''BMI指数(bmi是计算而来的,但很明显它听起来像是一个属性而非方法,如果我们将其做成一个属 ...
- 抽象类,接口类,封装,property,classmetod,statimethod
抽象类,接口类,封装,property,classmetod,statimethod(类方法,静态方法) 一丶抽象类和接口类 接口类(不崇尚用) 接口类:是规范子类的一个模板,只要接口类中定义的,就应 ...
- 封装和@property
封装和@property 一.复习 1.接口类和抽象类 python中没有接口类,有抽象类,abc模块中的metaclass=ABCMeta,@abstructmethod,本质是做代码规范用的,希望 ...
- 面向对象(三)——组合、多态、封装、property装饰器
组合.多态.封装.property装饰器 一.组合 1.什么是组合 组合指的是某一个对象拥有一个属性,该属性的值是另外一个类的对象 class Foo(): pass class Bar(): pas ...
- day32--面向对象的程序设计之继承实现的原理(继承顺序)、封装、property
Python之路,Day19 = 面向对象的程序设计之继承实现的原理(继承顺序).封装.property 以下类容参考自:http://www.cnblogs.com/metianzing/p/712 ...
- Python_Selenium 之以login_page为例实现对basepage封装好的方法调用和对common中公共方法的调用
目的:简化代码,提供框架该有的东西每一个函数 -提供了一个功能 - 公共的功能有了basepage,在PageObjects当中直接调用元素操作. 以下以login_page 为例,实现从配置文件中读 ...
随机推荐
- javascript中的抽象相等==与严格相等===
1.数据类型:String,Number,Boolean,Object,Null,Undefined 2.抽象相等:x==y A.两者数据类型相同:typeof x == typeof y a.Str ...
- hibernate基本配置
将讲解表名类名不一致.属性名列名不一致.不持久化某属性.Date类型的注解.枚举类型的注解(枚举类型在xml配置有点麻烦不说了),说明都在代码注释里. 项目目录: 注解方式以Teacher类为例,xm ...
- ubuntu 16.04通过源码方式安装nginx
1.下载nginx源码包 wget http://nginx.org/download/nginx-1.11.12.tar.gz 2.解压该tar包 tar zxvf nginx-1.11.12.t ...
- 【es6】let和const
let 1.不存在变量提升 es5中var和function都存在变量提升,但let声明的变量不存在. 在代码块内,使用let命令声明变量之前,该变量都是不可用的.这在语法上,称为“ ...
- Jmeter创建一个点对点的 JMS 测试计划
创建一个点对点的 JMS 测试计划 确保所需的jar文件位于JMeter lib目录中. 如果没有,关闭JMeter,复制jar文件并重新启动JMeter. 参见详细教程 在本节中,将学习如何创建测试 ...
- JavaScript自动化构建工具grunt、gulp、webpack介绍
前端开发自动化工作流工具,JavaScript自动化构建工具grunt.gulp.webpack介绍 前端自动化,这样的一个名词听起来非常的有吸引力,向往力.当今时代,前端工程师需要维护的代码变得及为 ...
- 基础爬虫,谁学谁会,用requests、正则表达式爬取豆瓣Top250电影数据!
爬取豆瓣Top250电影的评分.海报.影评等数据! 本项目是爬虫中最基础的,最简单的一例: 后面会有利用爬虫框架来完成更高级.自动化的爬虫程序. 此项目过程是运用requests请求库来获取h ...
- docker 常见操作
docker rm $(docker ps -a -q --filter status=exited) // 删除不在运行的 镜像
- IOS Core Image之一
项目中要实现高斯模糊的效果,今天看了下Core Image这块的内容, 主要包括CIImage.CIFilter.CIContext.CIDetector(检测).CIFeature(特征)等类. 今 ...
- Docker学习(五): 仓库与数据管理
特别声明: 博文主要是学习过程中的知识整理,以便之后的查阅回顾.部分内容来源于网络(如有摘录未标注请指出).内容如有差错,也欢迎指正! =============系列文章============= 1 ...