day30 Pyhton 面向对象 反射
@property
# 例1 - 1 (某一个属性如果是通过计算得来的,那么计算的过程写在方法里,把这个方法伪装成属性)
from math import pi
# class Circle:
# def __init__(self,r):
# self.r = r
#
# @property # 把一个方法伪装成属性 源码中有人写
# def area(self): # 被property装饰器装饰的方法不能传递除self以外的参数
# return pi*self.r**2
#
# @property
# def perimeter(self):
# return self.r*pi*2
#
# c1 = Circle(5)
# print(c1.area)
# c1.r = 10
# print(c1.area)
# 圆c1的面积\周长
# alex的名字 class Circle:
def __init__(self,r):
self.r = r
self.area = pi*self.r**2
self.perimeter = self.r*pi*2 c1 = Circle(5)
print(c1.area)#78.53981633974483
c1.r = 10
print(c1.area)#78.53981633974483 area的值在第一次赋值后就固定了 # 例2-1 某一个属性需要被私有化,又需要能被外部查看,这种情况,把这个属性通过方法返回,方法伪装成属性
# class Person:
# def __init__(self,name):
# self.__name = name # 不让外面随便修改
# def get_name(self):
# return self.__name
#
# alex = Person('alex')
# print(alex.get_name())
# 例2-2
# class Person:
# def __init__(self,name):
# self.__name = name # 不让外面随便修改
#
# @property
# def name(self):
# return self.__name
#
# alex = Person('alex')
# print(alex.name)
# 例2-3 修改属性值
class Person:
def __init__(self,name):
self.__name = name # 不让外面随便修改 @property
def name(self):
return self.__name @name.setter # 之前必须有一个同名的方法被property装饰过
def name(self,new_name):
if type(new_name) is str:
self.__name = new_name @name.deleter
def name(self):
del self.__name # def set_name(self,new_name):
# if type(new_name) is str:
# self.__name = new_name alex = Person('alex')
print(alex.name)
# alex.set_name(123)
# print(alex.name)
alex.name = 'alex_sb'
print(alex.name)
del alex.name # 删除name属性
print(alex.name)#'Person' object has no attribute '_Person__name'
# 你有没有什么时候
# 能拿到 字符串
# 你就希望能够通过这个字符串 --> 程序中的变量名(类名\函数名\变量名\方法名\对象名) # class Manager:pass
# class Student:pass
# class Teacher:pass
# identify = 'Student'
# print(eval(identify)())
# if 'identify' == 'Manager':
# Manager()
# elif 'identify' == 'Student':
# Student()
# elif 'identify' == 'Teacher':
# Teacher() # class Person:
# role = '人类'
# Country = '中国'
#
# attr = input('>>>') # role 人类
# # # Country 中国
# # print(getattr(Person,'role'))
# # print(getattr(Person,'Country'))
# if hasattr(Person,attr):
# print(getattr(Person,attr)) # if attr == 'role':
# print(Person.role)
# elif attr == 'Country':
# print(Person.Country) # getattr(命名空间,'key') == 命名空间.key
# 所有的a.b都可以被反射成getattr(a,'b') # 反射类中的方法
# class Person:
# role = '人类'
# @staticmethod
# def show_courses():
# print('所有课程')
# Person.role == getattr(Person,'role')
# Person.show_courses() == getattr(Person,'show_courses')()
# ret = getattr(Person,'show_courses')
# ret() # 有一个类,有很多静态属性,也有很多静态方法/类方法
# 用户输入input任意的属性名或者方法名,
# 如果是属性 直接打印 - 用到一个内置函数
# 如果是方法 直接调用 - 用到一个内置函数
# 要求程序不报错
# 什么是封装?
# 广义上
# 狭义上
# 类的命名空间(类的对象共享的资源) :
# 静态属性
# 类方法
# 静态方法
# 普通方法
# property方法
# 对象的命名空间(对象独有的资源):
# 对象的属性
# 对象的方法 # 狭义上
# 私有成员
# 在类的内部 __成员名
# 在类的外部 不能用
# 在存储的空间中 _类名__成员名 # 1.私有成员不能在类的外部使用,也不能被继承
# 无论在哪个类中调用私有成员,一定是在哪个类调,就用哪个类的
# 2.类中的三个装饰器方法
# 先实现功能
# 某个方法如果用到self 传self
# 某个方法如果没用到self,用到类 传cls ,加@classmethod装饰器 *****
# 某个方法如果没用到self,没用到类 啥也不传,加@staticmethod装饰器
# 但凡是不需要传self参数的,都不需要实例化,直接使用类调用就可以了
# @property : 伪装一个方法成为一个属性,调用的时候不需要加() # 3.反射 非常重要
# a.b这样的情况
# 如果由于某种原因,b变成了 'b'
# 那么就是用getattr(a,'b')的形式获取b对应的值
# 如果b是一个值 那么getattr的结果就是值
# 如果b是一个地址 那么getattr的结果就是地址,地址()就是执行
# from sys import modules
# getattr(modules[__name__],'全局变量名')
# 从当前文件中寻找全局变量对应的值/地址
day30 Pyhton 面向对象 反射的更多相关文章
- day30 Pyhton 面向对象 继承.装饰器
一面向对象相关 谈谈你对面向对象的理解 1.泛泛谈:什么情况下使用面向对象 2.针对面向对象的 封装 继承 多态一个一个的谈 3.根据你工作中的实际情况对应来举例子 封装 1.广义上:普遍的大家认为的 ...
- Python之面向对象反射
Python之面向对象反射 isinstance(obj,cls)检查是否obj是否是类 cls 的对象 1 class Foo(object): 2 pass 3 4 obj = Foo() 5 6 ...
- day26.面向对象-反射封装内置方法
封装 隐藏对象的属性和实现细节,近对外提供公共访问方式 广义:代码保护,面向对象思想 狭义:将属性,方法隐藏起来 class Person: __key = 123456 # 私有的静态属性 def ...
- python -- 面向对象 - 反射
1.isinstance ,type, issubclass isinstance:判断给的对象是否是**类型 type:返回**对象的数据类型 issubclas ...
- 面向对象 反射 和item系列和内置函数和__getattr__和__setattr__
反射 反射主要用在网络编程中, python面向对象的反射:通过字符串的形式操作对象相关的属性.python的一切事物都是对象. 反射就是通过字符串的形式,导入模块:通过字符串的形式,去模块寻找指定函 ...
- python 全栈开发,Day30(第一次面向对象考试)
月考题: python 全栈11期月考题 一 基础知识:(70分) 1.文件操作有哪些模式?请简述各模式的作用(2分) 2.详细说明tuple.list.dict的用法,以及它们的特点(3分) 3.解 ...
- Python之面向对象-反射
一.什么是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问,检测和修改它本省状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被 ...
- python全栈开发从入门到放弃之面向对象反射
1.classmethod.staticmethod方法 classmethod类方法默认参数cls,可以直接用类名调用,可以与类属性交互 #student文件内容 宝宝,男 博博,女 海娇,男 海燕 ...
- day31 Pyhton 面向对象的基础 三大特性
一.内容回顾 封装 1.概念 笔记 2.__名字 在类的外部就不能用了 3.私有化的 不能被子类继承,也不能在其他任何类中调用 三个装饰器方法(装饰类中的方法) 1.不被修饰的 普通方法,会使用对象 ...
随机推荐
- 本地模拟 gitlab ci 的 demo 项目
构建好的镜像能跑起来, 项目地址: https://github.com/szliugx/gitlab-ci-local 为了不每次提交,本地可以做一些模拟 gitlab ci 的测试≍,主要实现方式 ...
- [LeetCode]105. 从前序与中序遍历序列构造二叉树(递归)、108. 将有序数组转换为二叉搜索树(递归、二分)
题目 05. 从前序与中序遍历序列构造二叉树 根据一棵树的前序遍历与中序遍历构造二叉树. 注意: 你可以假设树中没有重复的元素. 题解 使用HashMap记录当前子树根节点在中序遍历中的位置,方便每次 ...
- Windows下安装Nginx及负载均衡
1.下载Windows版本的Nginx http://nginx.org/en/download.html 2.解压Nginx包,配置conf文件下的nginx.conf文件 3.配置说明: #use ...
- win10家庭版启用远程桌面
此电脑右键属性->远程设置->允许远程协助连接这台计算机 勾选 下载RDP Wrapper 地址:https://github.com/stascorp/rdpwrap/releases ...
- 使用Scrcpy实现电脑控制安卓手机
很多时候我们想要在电脑上使用一些手机软件,使用模拟器当然是一种选择,但是这些模拟器要不然不免费,要不然广告多不放心.Scrcpy是一个开源免费的软件,通过abd命令实现了安卓手机投屏和控制功能,并且支 ...
- android.support.v7.app.AppCompatActivity不能使用的解决办法
最近Android Studio 更新到4.0版本后,在构建项目时使用 android.support.v7.XX android.support.v4.XX 发现在xml文件中,原先我最常使用的Dr ...
- 利用Z.Expressions.Eval表达式求值
Z.Expression.Eval是一个开源的(OpenSource),可扩展的(Extensible),超轻量级(Super lightweight)的公式化语言解析执行工具包. 使用方法:1.从n ...
- gRPC-go 入门(1):Hello World
摘要 在这篇文章中,主要是跟你介绍一下gRPC这个东西. 然后,我会创建一个简单的练习项目,作为gRPC的Hello World项目. 在这个项目中,只有很简单的一个RPC函数,用于说明gRPC的工作 ...
- React 服务端渲染方案完美的解决方案
最近在开发一个服务端渲染工具,通过一篇小文大致介绍下服务端渲染,和服务端渲染的方式方法.在此文后面有两中服务端渲染方式的构思,根据你对服务端渲染的利弊权衡,你会选择哪一种服务端渲染方式呢? 什么是服务 ...
- Python-变量、变量作用域、垃圾回收机制原理-global nonlocal
变量实现原理决定了Python使用的垃圾回收机制为变量引用计数,当这个对象引用计数为0时候,则会自动执行__del__函数回收资源, del方法只是把变量指向的对象引用计数减一而已并删除这个变量 表达 ...