python全栈开发 * 22 面向对象 知识点汇总 * 180703
22 面向对象
-----属性,类方法,静态方法,反射
一.属性
1.属性的定义:将方法伪装成属性,虽然在代码层面上没有任何高深之处,但让其看起来更合理. (类似于属性的方法)
class Person:
def __init__(self,name,weight,height):
self.name=name
self.weight=weight
self.height=height
@property
def bmi(self):
return self.weight/self.height**2
p1=Person("吉喆嚞",56,1.65)
# print(p1.bmi()) # 20.569329660238754 (不加@property)
print(p1.bmi) # 20.569329660238754 (加@property)
2.由于新式类中具有三种访问方式,我们可以根据他们几个属性的访问特点,分别将三个方法定义为对同一个属性:获取、修改、删除
class Goods:
def __init__(self,original_price,discount):
self.original_price=original_price
self.discount=discount
@property #获取
def price(self):
return self.original_price*self.discount
@price.setter #修改
def price(self,new_price):
self.original_price=new_price
@price.deleter #删除
def price(self):
del self.discount g1=Goods(5,0.80) # 实例化一个对象
print(g1.price()) # 不加@property的用法 4.0
print(g1.price) # 自动执行@property下的函数 4.0
g1.original_price=10 # 自动执行@price.setter下面的函数 将原价改为10
print(g1.price) # 8
del g1.discount # 自动执行@price.deleter下面的函数
print(g1.discount) # 'Goods' object has no attribute 'discount' 二.方法
方法包括:普通方法、静态方法和类方法,三种方法在内存中都归属于类,区别在于调用方式不同
1.普通方法:由对象调用;至少一个self参数;执行普通方法时,自动将调用该方法的对象赋值给self;
2.类方法 : 由类调用; 至少一个cls参数;执行类方法时,自动将调用该方法的类复制给cls;对象如果调用类方法,也是自动
将类空间传给cls,不是把对象空间传给cls.
@classmethod
def class_func(cls): 定义类方法,至少有一个cls参数
类名.class_func() 调用类方法
class A:
__name = 'alex'
def func(self):
print(self,'in func') @classmethod # 类方法
def func1(cls):
print(cls, 'in func1')
a1=A()
a1.func() #<__main__.A object at 0x0000011792F389E8> in func
A.func(a1) #<__main__.A object at 0x0000011792F389E8> in func
A.func1() #<class '__main__.A'> in func1 自动给cls传类空间
a1.func1() #<class '__main__.A'> in func1 对象调用也是自动传类空间
# 什么情况下使用类方法?
# 直接让类去操作类中的方法,没有必要创建对象在操作的时候,用类方法.
3.静态方法: 由类调用;无默认参数 在类中定义一个静态方法,无需传入你的类空间,对象空间,可以当成普通函数去用.
@staticmethod
def static_func():
类名.static_func()
class A:
__name = 'alex'
def func(self):
print(self,'in func') @classmethod # 类方法
def func1(cls):
print(cls, 'in func1')
@staticmethod
def login(username,password):
print("登陆成功")
A.login("alex","123")
相同点 : 对于所有的方法而言,均属于类(非对象)中,所以在内存中也只保存一份。
不同点 :方法调用者不同、调用方法时自动传入的参数不同
三.反射
1.反射的定义 通过字符串操作对象相关属性;python中的一切事物都是对象(都可以使用反射)
2.反射一共有四种 (四个可以实现自省的函数)
getattr 获取这个属性对应的值
hasattr 判断此对象中有没有这个属性
setattr 设置属性
delattr 对一个对象属性进行删除
3.用法:
(1).实例化一个对象
class A:
country = 'China'
def __init__(self, name, age):
self.name = name
self.age = age
a1 = A('alex', 1000)
print(getattr(a1,"country")) # China
print(getattr(a1,"name")) # alex
print(hasattr(a1,"age")) # True
setattr(a1,"sex","男")
print(getattr(a1,"sex")) # 男
delattr(a1,"name")
print(getattr(a1,"name")) # 'A' object has no attribute 'name'
if hasattr(a1,"name1"):
print(getattr(a1,'name1'))
else:
print("没有...") # 没有 (2). 对类的示例
class A:
country = 'China'
job = 'student' def __init__(self, name, age):
self.name = name
self.age = age
def func(self):
print('in func')
content=input("<<<") # 输入的是 字符串
if hasattr(A,content): # 相当于 if hasattr(A,"字符串")
print(getattr(A,content))
print(getattr(A,"func")) # <function A.func at 0x00000145E4F99AE8>
print(getattr(A,"func")(11)) # in func None (默认返回None)
print(getattr(A,"job")) # student
print(getattr(A,"job1","False")) # False
print(getattr(A,"job1")) # 报错 type object 'A' has no attribute 'job1' (3).对其他模块的示例
import old_boy
object=getattr(old_boy,"B")
print(getattr(object,"add")(3,4)) # 第一种方式 获取old_boy文件中的静态方法add
print(getattr(old_boy.B,'add')(3,4)) # 第二种方式
print(getattr(old_boy,'login')("alex","123")) # 调用old_boy 文件中的login函数 (4).对当前模块的示例
import sys
def login():
print(55) def func3():
print(333)
content=input("<<<")
getattr(sys.modules[__name__],content)() # 55
getattr(sys.modules[__name__],"func3")() # 333
python全栈开发 * 22 面向对象 知识点汇总 * 180703的更多相关文章
- python全栈开发 * 23 面向对象 知识点汇总 * 180704
23 面向对象 -----特殊方法 1. isinstance(obj,类名) 判断对象是否是此类实例化或者此类的子类实例化出来的class A:passclass B(A):passb1=B()pr ...
- python全栈开发 * 19 面向对象 知识点汇总 * 180701
19 面向对象初识2 一.类的名称空间1.对象的名称空间对象的名称空间中有类对象指针,对象可以通过"类对象指针"找类中的"静态变量"(静态字段),也可以用对象找 ...
- python全栈开发 * 18 面向对象知识点汇总 * 180530
18 面向对象初识1class person: level="高级动物" mind="有思想" def __init__(self,name,age,gent, ...
- python全栈开发 * 20 继承知识点汇总 * 180530
20 面向对象的三大特征之一(继承,多态,封装) -----继承 1.继承的定义: 继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类;父类又可称为基类或超类,新建的类称为派生 ...
- Python全栈开发【面向对象进阶】
Python全栈开发[面向对象进阶] 本节内容: isinstance(obj,cls)和issubclass(sub,super) 反射 __setattr__,__delattr__,__geta ...
- Python全栈开发【面向对象】
Python全栈开发[面向对象] 本节内容: 三大编程范式 面向对象设计与面向对象编程 类和对象 静态属性.类方法.静态方法 类组合 继承 多态 封装 三大编程范式 三大编程范式: 1.面向过程编程 ...
- Python 全栈开发七 面向对象
一.编程范式 编程是程序员用特定的语法+数据结构+算法组成的代码来告诉计算机如何执行任务的过程 , 一个程序是程序员为了得到一个任务结果而编写的一组指令的集合,正所谓条条大路通罗马,实现一个任务的方式 ...
- 巨蟒python全栈开发django9:一些知识点的汇总
回顾上周内容: 题目: 1.人民出版社出版过的所有书籍的名字以及作者的姓名(三种写法,笔记中有两种写法) 2.手机以2开头的作者出版过的所有书籍名称以及出版社名称(三种写法,笔记中有1种写法) 1.聚 ...
- python全栈开发day21面向对象初识总结
随机推荐
- centos 安装gitee备忘
centos 安装gitee备忘:安装前需要升级git.需要安装mysql阿里云主机需要把端口加入例外需要修改全局配置文件把localhost改为ip需要设置为后台运行
- jetty9.4缓存文件目录自定义
jetty9.4安装包解压之后,有几个修改的地方和jetty7.6有不同,需要单独注意一下: 1. 端口设置 端口设置在${jetty_home}/start.ini中 2. 缓存文件生成目录 项目通 ...
- server后台TCP连接存活问题
公司的server后台部署在某一个地方,接入的是用户的APP,而该地方的网络信号较差,导致了server后台在执行一段时间后用户无法接入,那边的同事反馈使用netstat查看系统.存在较多的TCP连接 ...
- 为啥百度、网易、小米都用Python?Python的用途是什么?
Python是一门脚本语言.由于能将其他各种编程语言写的模块粘接在一起,也被称作胶水语言.强大的包容性.强悍的功能和应用的广泛性使其受到越来越多的关注,想起一句老话:你若盛开.蝴蝶自来. 假设你感 ...
- 【资料下载区】【GK101固件】更新日期2017/1/11
<GK101任意波发生器>升级固件发布(版本:1.0.2build539)<GK101任意波发生器>升级固件发布(版本:1.0.2build851)<GK101任意波发生 ...
- halcon应用案例探究
14.1 Access 1. get_region_chain 功能:一个对象的轮廓(contour)作为链式码. 2. get_region_contour 功能:查询一个目标的轮廓(contou ...
- “Java是编译执行的语言”这句话对吗?
现在让你谈谈对Java平台的理解,你是否会感觉内容过于庞大?这个问题是比较宽泛的,Java发展到现在已经不仅仅是语言这么简单了,Java平台涉及的,包括但不仅限于下面提到的这些内容: Java语言本身 ...
- node-log4js3.0.6配置
const log4js = require('log4js'); const conf = { "appenders": { "access": { &quo ...
- Windows上使用telnet测试端口号
之前测试服务器某一端口开启开启情况一般在服务器上使用 netstat –ano|findstr "端口号"命令查看. 但是有时候端口在服务器上开通了,但是客户端并不一定可以访问到 ...
- C# 如何通过mailto标签和SMTP协议两种方式发送邮件
本文主要讲解如何通过如现mailto标签和SMTP协议两种方式发送邮件,下面就直入主题 方法一.通过mailto标签发送邮件 通过mailto不是正真意义上的发送邮件,它只是会自动调用我们本地默认的邮 ...