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. [Vuex] Use Namespaces in Vuex Stores using TypeScript

    Even by using modules, they still share the same namespace. So you couldn’t have the same mutation n ...

  2. SSE图像算法优化系列十九:一种局部Gamma校正对比度增强算法及其SSE优化。

    这是一篇2010年比较古老的文章了,是在QQ群里一位群友提到的,无聊下载看了下,其实也没有啥高深的理论,抽空实现了下,虽然不高大上,还是花了点时间和心思优化了代码,既然这样,就顺便分享下优化的思路和经 ...

  3. Object 标签遮挡 Div 显示

    最近在使用 Object 时,就是播放视频的 Object 标签遮挡住其他 div 标签,不能正常显示. 出现这种现象的原因: object 标签不在 dom 文档流里面,浏览器在解析的时候先把 ob ...

  4. JavaWeb开发的一些问题

    从今天开始,在此帖陆续会记录一些平时所遇到的一些问题 1.20181229 org.apache.ibatis.binding.BindingException: Invalid bound stat ...

  5. Sandcastle Help File Builder(.NET帮助文档工具)的版本选择心得——支持VS2010至VS2015,高版本项目文件问题

    作者: zyl910 一.缘由 "Sandcastle Help File Builder"(简称SHFB)是一个很好用.NET 帮助文档生成工具. 但它的每个版本支持的VS版本范 ...

  6. Centos升级mongo客户端

    一.背景 在宿主机centos上启一个Mongo容器,暴露端口21117,并设置用户名,密码(root/mongo) docker run --name mongo1 -p : -d mongo -- ...

  7. 【理论面试篇】收集整理来自网络上的一些常见的 经典前端、H5面试题 Web前端开发面试题

    ##2017.10.30收集 面试技巧 5.1 面试形式 1)        一般而言,小公司做笔试题:大公司面谈项目经验:做地图的一定考算法 2)        面试官喜欢什么样的人 ü  技术好. ...

  8. Android Studio集成到Genymotion模拟器

    环境:Mac Android Studio 一.下载Android Studio 下载地址:http://www.android-studio.org/ 这个的安装没啥好说的了,基本的. 二.下载Ge ...

  9. [HDFS Manual] CH4 HDFS High Availability Using the Quorum Journal Manager

    HDFS High Availability Using the Quorum Journal Manager HDFS High Availability Using the Quorum Jour ...

  10. Unix时间转LInux时间

    private static long getTime() { long currentTimeMillis = System.currentTimeMillis(); long nanoTime = ...