@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 面向对象 反射的更多相关文章

  1. day30 Pyhton 面向对象 继承.装饰器

    一面向对象相关 谈谈你对面向对象的理解 1.泛泛谈:什么情况下使用面向对象 2.针对面向对象的 封装 继承 多态一个一个的谈 3.根据你工作中的实际情况对应来举例子 封装 1.广义上:普遍的大家认为的 ...

  2. Python之面向对象反射

    Python之面向对象反射 isinstance(obj,cls)检查是否obj是否是类 cls 的对象 1 class Foo(object): 2 pass 3 4 obj = Foo() 5 6 ...

  3. day26.面向对象-反射封装内置方法

    封装 隐藏对象的属性和实现细节,近对外提供公共访问方式 广义:代码保护,面向对象思想 狭义:将属性,方法隐藏起来 class Person: __key = 123456 # 私有的静态属性 def ...

  4. python -- 面向对象 - 反射

    1.isinstance ,type, issubclass       isinstance:判断给的对象是否是**类型       type:返回**对象的数据类型       issubclas ...

  5. 面向对象 反射 和item系列和内置函数和__getattr__和__setattr__

    反射 反射主要用在网络编程中, python面向对象的反射:通过字符串的形式操作对象相关的属性.python的一切事物都是对象. 反射就是通过字符串的形式,导入模块:通过字符串的形式,去模块寻找指定函 ...

  6. python 全栈开发,Day30(第一次面向对象考试)

    月考题: python 全栈11期月考题 一 基础知识:(70分) 1.文件操作有哪些模式?请简述各模式的作用(2分) 2.详细说明tuple.list.dict的用法,以及它们的特点(3分) 3.解 ...

  7. Python之面向对象-反射

    一.什么是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问,检测和修改它本省状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被 ...

  8. python全栈开发从入门到放弃之面向对象反射

    1.classmethod.staticmethod方法 classmethod类方法默认参数cls,可以直接用类名调用,可以与类属性交互 #student文件内容 宝宝,男 博博,女 海娇,男 海燕 ...

  9. day31 Pyhton 面向对象的基础 三大特性

    一.内容回顾 封装 1.概念 笔记 2.__名字 在类的外部就不能用了 3.私有化的 不能被子类继承,也不能在其他任何类中调用 三个装饰器方法(装饰类中的方法) 1.不被修饰的  普通方法,会使用对象 ...

随机推荐

  1. 2020年1月31日 安装Python的requests包记录

    C:\Users\ufo>pip install requests Collecting requests WARNING: Retrying (Retry(total=, connect=No ...

  2. Kubernetes-12:Secret介绍及演示

    Secret介绍 Secret存在的意义 Secret解决了密码.token.密钥等敏感数据的配置问题,而不需要把这些敏感数据暴露到镜像或者Pod Spec中,可以以Volume或者环境变量的方式使用 ...

  3. cmd运行SpringBoot的jar中文乱码

    问题: 通过以下命令启动springBoot项目后,在项目中查看日志,发现中文乱码 java -jar projectName.jar 解决 启动时添加参数-Dfile.encoding=UTF-8即 ...

  4. oracle数据处理之sql*loader(二)

    目录 SQL*Loader对不同文件及格式的处理方法 2.1 Excel文件 一般的Excel文件最大行数不超过65536行,说明数据处理量并不大,处理Excel的方式是将其另存为CSV格式文件,然后 ...

  5. [Java并发]实现两个线程交替打印奇偶数(volatile+yield实现)

    解题思路 实现一个类OddEven 有一个打印奇数的方法,有一个打印偶数的方法. 类中有一个volatile变量 ,用来控制当前状态是该哪个方法打印. 方法中打印每个数前首先判断volatile变量的 ...

  6. [LeetCode]23. 合并K个排序链表(优先队列;分治待做)

    题目 合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [   1->4->5,   1->3->4,   2->6 ] 输出: 1 ...

  7. vsCode 设置vue文件标签内的style智能提示

    VS Code 文件->首选项->设置 搜索:files.associations 点击在setting.json中编辑 最后一行添加配置: "files.association ...

  8. 跟我一起学.NetCore之静态文件处理的那些事

    前言 如今前后端分离开发模式如火如荼,开发职责更加分明(当然前后端一起搞的模式也没有完全褪去):而对于每个公司产品实施来说,部署模式会稍有差别,有的会单独将前端文件部署为一个站点,有的会将前端文件和后 ...

  9. js学习笔记之作用域链和闭包

    在学习闭包之前我们很有必要先了解什么是作用域链 一.作用域链 作用域链是保证对执行环境有权访问的所有变量和函数的有序访问. 这句话其实还是蛮抽象的,但是通过下面一个例子,我们就能清楚的了解到作用域链了 ...

  10. odoo13之在odoo中添加自定义页面

    注: 本博文是阅读Ruter博客 在odoo中添加自定义页面 后所做的个人总结,以及博文搬迁,主要是便于自己的后期理解:大部分内容为搬运,当然也包括自己的一些总结和流程优化. 前言 首先展示效果:进入 ...