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的更多相关文章

  1. python全栈开发 * 23 面向对象 知识点汇总 * 180704

    23 面向对象 -----特殊方法 1. isinstance(obj,类名) 判断对象是否是此类实例化或者此类的子类实例化出来的class A:passclass B(A):passb1=B()pr ...

  2. python全栈开发 * 19 面向对象 知识点汇总 * 180701

    19 面向对象初识2 一.类的名称空间1.对象的名称空间对象的名称空间中有类对象指针,对象可以通过"类对象指针"找类中的"静态变量"(静态字段),也可以用对象找 ...

  3. python全栈开发 * 18 面向对象知识点汇总 * 180530

    18 面向对象初识1class person: level="高级动物" mind="有思想" def __init__(self,name,age,gent, ...

  4. python全栈开发 * 20 继承知识点汇总 * 180530

    20 面向对象的三大特征之一(继承,多态,封装) -----继承 1.继承的定义: 继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类;父类又可称为基类或超类,新建的类称为派生 ...

  5. Python全栈开发【面向对象进阶】

    Python全栈开发[面向对象进阶] 本节内容: isinstance(obj,cls)和issubclass(sub,super) 反射 __setattr__,__delattr__,__geta ...

  6. Python全栈开发【面向对象】

    Python全栈开发[面向对象] 本节内容: 三大编程范式 面向对象设计与面向对象编程 类和对象 静态属性.类方法.静态方法 类组合 继承 多态 封装 三大编程范式 三大编程范式: 1.面向过程编程 ...

  7. Python 全栈开发七 面向对象

    一.编程范式 编程是程序员用特定的语法+数据结构+算法组成的代码来告诉计算机如何执行任务的过程 , 一个程序是程序员为了得到一个任务结果而编写的一组指令的集合,正所谓条条大路通罗马,实现一个任务的方式 ...

  8. 巨蟒python全栈开发django9:一些知识点的汇总

    回顾上周内容: 题目: 1.人民出版社出版过的所有书籍的名字以及作者的姓名(三种写法,笔记中有两种写法) 2.手机以2开头的作者出版过的所有书籍名称以及出版社名称(三种写法,笔记中有1种写法) 1.聚 ...

  9. python全栈开发day21面向对象初识总结

随机推荐

  1. Jenkins安装卸载

    下载安装去Jenkins官网下载Jenkins,Centos的话会下载到.rpm安装文件 安装.rpm文件使用命令rpm -ivh **.rpm 安装完成之后使用命令rpm -qc jenkins查看 ...

  2. hive SQL 静态分区和 动态分区

    Hive 分区介绍: hive中简单介绍分区表(partition table),含动态分区(dynamic partition)与静态分区(static partition) hive中创建分区表没 ...

  3. What’s new for Spark SQL in Apache Spark 1.3(中英双语)

    文章标题 What’s new for Spark SQL in Apache Spark 1.3 作者介绍 Michael Armbrust 文章正文 The Apache Spark 1.3 re ...

  4. BizTalk RosettaNet 配置导入与导出

    更多内容请查看:BizTalk动手实验系列目录                             BizTalk 开发系列 BizTalk 培训/项目开发/技术支持请联系:Email:cbcye ...

  5. MySql基本查询、连接查询、子查询、正则表达查询解说

    林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 查询数据指从数据库中获取所须要的数据.查询数据是数据库操作中最经常使用,也是最重要的操作.用户 ...

  6. 【小工具】根据定义的白名单字段进行Bean的拷贝

    背景 Bean的拷贝一直有一些类可以使用,比如Apache的org.apache.commons.beanutils.BeanUtils或者Spring的org.springframework.bea ...

  7. BlackHat Arsenal USA 2018 ToolsWatch黑客工具库

    原文链接:https://medium.com/hack-with-github/black-hat-arsenal-usa-2018-the-w0w-lineup-7de9b6d32796 Blac ...

  8. [转]Kindeditor图片粘贴上传(chrome)

    原文地址:https://www.cnblogs.com/jsper/p/7608004.html 首先要赞一下kindeditor,一个十分强大的国产开源web-editor组件. kindedit ...

  9. QT 信号槽connect中解决自定义数据类型或数组作为函数参数的问题——QT qRegisterMetaType 注册MetaType——关键:注册自定义数据类型或QMap等容器类

    一般情况下信号槽直接连接方式不会出现问题,但是如果信号与槽在不同线程或Qt::QueuedConnection方式连接,可能会在连接期间报以下类似问题,如: QObject::connect: Can ...

  10. GRE tunnel 2

    1.GRE简介 通用路由封装协议GRE(Generic Routing Encapsulation)可以对某些网络层协议(如IPX.ATM.IPv6.AppleTalk等)的数据报文进行封装,使这些被 ...