封装
隐藏对象的属性和实现细节,近对外提供公共访问方式
广义:代码保护,面向对象思想
狭义:将属性,方法隐藏起来
class Person:
__key = 123456 # 私有的静态属性
def __init__(self,name,passwd):
self.name = name
self.__passwd = passwd # 私有的属性 def __test(self): # 私有方法
print(self.__dict__)
print('私有方法内部调用') ## 只要在类的内部使用私有属性,就会自动带上_类名 def test2(self):
return self.__test # 私有方法只能在内部调用 def get_pwd(self):
# return self.get_pwd
return self.__passwd alex = Person('alex',123456)
alex.__high = 170
# print(alex.getwd()) # 程序定义__私有属性,保存为了(_类__属性)的形式
print(alex.__high) ## 在类的外部定义的双下划线方法,可以被调用,格式也有变化。
print(alex.get_pwd())
ret = alex.test2()
print(ret)
ret()
###############
170
123456
<bound method Person.__test of <__main__.Person object at 0x00000200B052EC50>>
{'name': 'alex', '_Person__passwd': 123456, '__high': 170}
私有方法内部调用
小结:
所有的私有,都是在变量左边加双下划线
所有的私有,在类内部随便调用,不能在类外部使用,__dict__是投机取巧的方法
私有包括:私有属性,私有方法,私有静态
几个内置函数
property
伪装代码,让代码看起来更加合理
from math import pi
class Circle:
def __init__(self,r):
self.r = r @property
def perimeter(self):
return 2 * pi * self.r
@property
def area(self):
return self.r ** 2 * pi c1 = Circle(5)
print(c1.area) # 代码经过伪装,名词'类方法'看起来更像是属性更加合理
print(c1.perimeter)
##################
78.53981633974483
31.41592653589793
一个静态属性property本质就是实现了get,set,delete三种方法
set可以理解为修改
delete可以理解为删除
class Foo:
@property
def AAA(self):
print('get的时候运行我啊') @AAA.setter
def AAA(self,value):
print('set的时候运行我啊') @AAA.deleter
def AAA(self):
print('delete的时候运行我啊') #只有在属性AAA定义property后才能定义AAA.setter,AAA.deleter
f1=Foo()
f1.AAA
f1.AAA='aaa'
del f1.AAA
#########
get的时候运行我啊
set的时候运行我啊
delete的时候运行我啊
怎么用,比如说
class Goods: def __init__(self):
# 原价
self.original_price = 100
# 折扣
self.discount = 0.8 @property
def price(self):
# 实际价格 = 原价 * 折扣
new_price = self.original_price * self.discount
return new_price @price.setter
def price(self, value): # setter要在self,后面加入一个参数,设置得参数
self.original_price = value @price.deleter
def price(self):
del self.original_price obj = Goods()
obj.price # 获取商品价格
obj.price = 200 # 修改商品原价
print(obj.price)
del obj.price # 删除商品原价
classmethod 和 staticmethod 类方法,静态方法
classmethon 可以把一个方法变成类方法,进而直接调用。不需要依赖对象
class Goods:
__discount = 0.8 # 这里是我们定义的打折
def __init__(self,name,price):
self.name = name
self.__price = price
@property
def price(self):
return self.__price * Goods.__discount # 返回折扣价格 # def change_discount(self,new_discount): # 修改一个新的折扣
# Goods.__discount = new_discount
@classmethod # 把一个方法变成类的方法,这个方法可以被类直接调用。不需要依赖任何对象
def change_discount(cls,new_discount): # 这里在定义类方法得时候,还需要再传入一个参数
cls.__discount = new_discount apple = Goods('apple',5)
# apple.change_discount(0.5) # 这里我们使用苹果去定义整个商品的折扣是不合理的
# print(apple.price)
Goods.change_discount(0.5)
print(apple.price)
staticmethod 可以将一个与类无相关的伪装成类的属性
class Login:
def __init__(self,name,password):
self.name = name
self.pwd = password
def login(self):pass @staticmethod
def get_usr_pwd():
usr = input('用户名:')
pwd = input('密码:')
Login(usr,pwd) Login.get_usr_pwd()
反射
大概是将字符串变成参数传递
class Teacher:
dic = {'显示课程':'数学','显示班级':'2014届'} def show_price(self):
print('工资5000快') @classmethod
def func(cls):
print('体育老师') ret = getattr(Teacher,'dic') # 1.调用静态属性:类的静态属性可以直接获取
print(ret)
tom = Teacher()
ret2 = getattr(tom,'show_price') # 2.调用对象属性:实例化一个类对象然后再获取其对象属性
# print(ret2)
ret2() if hasattr(Teacher,'func'): # 一般 hasattr 和 getattr 一起使用,不存在则不报错
ret3 = getattr(Teacher,'func') # 3.调用类方法:类方法的调用,直接调用需要实例化
ret3()
{'显示课程': '数学', '显示班级': '2014届'}
工资5000快
体育老师
day26.面向对象-反射封装内置方法的更多相关文章
-
python面向对象 : 反射和内置方法
一. 反射 1. isinstance()和issubclass() isinstance( 对象名, 类名) : 判断对象所属关系,包括父类 (注:type(对象名) is 类名 : 判断对象所属 ...
-
python 面向对象反射以及内置方法
一.反射 什么是反射:可以用字符串的方式去访问对象的属性,调用对象的方法(但是不能去访问方法),python中一切皆对象,都可以使用放射. 反射的四种方法: hasattr:hasattr(objec ...
-
python 面向对象之反射及内置方法
面向对象之反射及内置方法 一.静态方法(staticmethod)和类方法(classmethod) 类方法:有个默认参数cls,并且可以直接用类名去调用,可以与类属性交互(也就是可以使用类属性) 静 ...
-
面向对象(五)——isinstance与issubclass、反射、内置方法
isinstance与issubclass.反射.内置方法 一.isinstance与issubclass方法 1.isinstance是用来判断对象是否是某个类 isinstance(obj,cla ...
-
铁乐学python_day24_面向对象进阶1_内置方法
铁乐学python_day24_面向对象进阶1_内置方法 题外话1: 学习方法[wwwh] what where why how 是什么,用在哪里,为什么,怎么用 学习到一个新知识点的时候,多问问上面 ...
-
Python反射和内置方法(双下方法)
Python反射和内置方法(双下方法) 一.反射 什么是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发 ...
-
Python之路(第二十五篇) 面向对象初级:反射、内置方法
[TOC] 一.反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它 ...
-
面向对象(五)--isinstance与issubclass方法、反射、内置方法(部分)、异常处理
一.isinstance与issubclass方法 1.isinstance是用来判断对象是否是某个类 isinstance(obj,class) 2.issubclass是用来判断一个类是否为另一个 ...
-
python面向对象之反射和内置方法
一.静态方法(staticmethod)和类方法(classmethod) 类方法:有个默认参数cls,并且可以直接用类名去调用,可以与类属性交互(也就是可以使用类属性) 静态方法:让类里的方法直接被 ...
随机推荐
-
mysql中ip和整数的转换
INET_ATON(expr) 给出一个作为字符串的网络地址的点地址表示,返回一个代表该地址数值的整数.地址可以是4或8比特地址. mysql> SELECT INET_ATON('209.20 ...
-
Windows Azure Virtual Machine (27) 使用psping工具,测试Azure VM网络连通性
<Windows Azure Platform 系列文章目录> 微软Azure在设计架构的时候,从安全角度考虑,是禁用ICMP协议的.所以对于Azure VM,是无法使用ping命令的. ...
-
HTML5+JS 《五子飞》游戏实现(六)鼠标响应与多重选择
上一章我们提到了如果有多条线上的棋子可以被吃掉,那么游戏需要提示用户,让用户选择吃哪条线上的.另外因为是网页游戏,所以一定要实现鼠标单击棋子可以进行操作. 当鼠标移动棋子上面后,切换鼠标指针为手形,移 ...
-
dp水题 序列问题 (9道)
9道题.A了8道,A题看题解也没弄懂怎么维护m段子序列的,过一段时间再回来看看 dp试水 47:56:23 125:00:00 Overview Problem Status Rank ( ...
-
.NET NLog 详解(一)
安装NLog NLog 的源代码托管在Github 上,一般的人直接使用NuGet就可以了. 这里我们选择安装NLog.Config.当然最方便的还是直接使用命令行: Install-Package ...
-
发布ASP(非.Net)网站
1.安装IIS 2.设置网址.端口 3.设置文档(默认访问的文档,比如index.asp,index.htm等) 4.双击asp - 展开行为 - 启用父路径:true - 允许访问父目录 5.应用程 ...
-
基于visual Studio2013解决C语言竞赛题之0904文件排序
题目
-
NVIDIA Titan Xp Star Wars Collector&#39;s Edition显卡深度学习工作站 + Ubuntu17.10 + Tensorflow-gpu + Anaconda3 + Python 3.6 设置
为了能让 Tensorflow GPU 版本跑起来,我折腾了1个多星期. 总体参照 https://zhuanlan.zhihu.com/p/32118549 ,安装成功,但还是有不足的地方, 在此记 ...
-
SpringBoot系列——mail
前言 邮件是许多项目里都需要用到的功能,之前一直都是用JavaMail来发,现在Spring框架为使用JavaMailSender接口发送电子邮件提供了一个简单的抽象,Spring Boot为它提供了 ...
-
Java代码常见的十种错误
每一个程序员在编写代码的过程中都免不了出现错误或是小的失误,这些小的错误和失误往往使得程序员还得返工.那么,如何才能尽量避免这些错误的发生呢?笔者总结只有在日常的编写代码中总结出经验,在这篇文章中,笔 ...