python day21 ——面向对像-反射 getattr,内置方法
一、反射:用字符串数据类型的变量名来访问这个变量的值
上代码^_^
# class Student:
# ROLE = 'STUDENT'
# @classmethod
# def check_course(cls):
# print('查看课程了')
#
# @staticmethod
# def login():
# print('登录')
# # 反射查看属性
# # print(Student.ROLE)#普通方法
# # print(getattr(Student,'ROLE'))
#
# # 反射调用方法
# # getattr(Student,'check_course')() # 使用类中的方法
# # getattr(Student,'login')() # 使用静态方法
用对象来反射
# class A():
# def __init__(self,name):
# self.name = name
#
# def func(self):
# print('in func')
#
# a = A('alex')#实例化一个对象
# print(a.name)
# print(getattr(a,'name'))#获得属性值
# getattr(a,'func')()#执行方法
是不是还挺好理解的啊!!
模块角度
好像是不是有xxx.xxx就能用到啊,模块四不四 from xxx import xxx.xxx啊,对就能用。
# import os # 别人写好的python代码的结合
# # os.rename('__init__.py','init')#改文件名的功能
# # getattr(os,'rename')('init','__init__.py') #功能和上面一样后面是参数。
# rename = os.rename
# rename2 = getattr(os,'rename')
# rename2('__init__.py','init') # os.rename('__init__.py','init')
# rename('init','init2') # os.rename('init','init2')
下一个是 反射自己模块中的内容 找到自己当前文件所在的命名空间。这个有点不好理解,不过聪明人会先记住有机会慢慢在理解。
# import sys
# print(sys.modules)#查看当前模块,返回的是一个字典
# import 都相当于导入了一个模块
# 模块哪个导入了 哪个没导入 在我的python解释器里应该记录下来
# import sys 是一个模块,这个模块里的所有的方法都是和python解释器相关的
# sys.modules 这个方法 表示所有在当前这个python程序中导入的模块
# '__main__': <module '__main__' from 'D:/sylar/python_workspace/day20/4.反射.py'>
# print(sys.modules['__main__'])
# my_file = sys.modules['__main__']#这个先记住
# my_file.wahaha()
# my_file.qqxing()
# # 'qqxing'
# # 'wahaha'
# getattr(my_file,'wahaha')()
# getattr(my_file,'qqxing')()
总结下
# 反射
# hasattr,getattr
# 类名.名字
# getattr(类名,'名字')
# 对象名.名字
# getattr(对象,'名字')
# 模块名.名字
# import 模块
# getattr(模块,'名字')
# 自己文件.名字
# import sys
# getattr(sys.modules['__main__'],'名字')
下面来个实际应用场景,理解后背下来自己敲一便。
# class Manager:
# OPERATE_DIC = [
# ('创造学生账号', 'create_student'),
# ('创建课程','create_course'),
# ('查看学生信息','check_student_info'),
# ]
# def __init__(self,name):
# self.name = name
# def create_student(self):
# print('创建学生账号')
# def create_course(self):
# print('创建课程')
# def check_student_info(self):
# print('查看学生信息')
#
# class Student:
# OPERATE_DIC = [
# ('查看所有课程', 'check_course'),
# ('选择课程', 'choose_course'),
# ('查看已选择的课程', 'choosed_course')
# ]
# def __init__(self,name):
# self.name = name
# def check_course(self):
# print('check_course')
# def choose_course(self):
# print('choose_course')
# def choosed_course(self):
# print('查看已选择的课程')
#
# def login():
# username = input('user : ')
# password = input('pwd : ')
# with open('userinfo') as f:
# for line in f:
# user,pwd,ident = line.strip().split('|') # ident = 'Manager'
# if user == username and pwd == password:
# print('登录成功')
# return username,ident
#
# import sys
# def main():
# usr,id = login()
# print('user,id :',usr,id)
# file = sys.modules['__main__']
# cls = getattr(file,id) #Manager = getattr(当前文件,'Manager'),获得对应的类
# obj = cls(usr)
# operate_dic = cls.OPERATE_DIC
# while True:
# for num,i in enumerate(operate_dic,1):
# print(num,i[0])
# choice = int(input('num >>>'))
# choice_item = operate_dic[choice-1]
# getattr(obj,choice_item[1])()
#
#
#
# main()
主要是实现登陆和特定人员的选择和更改。
二、内置方法:有些函数里面带了特定的方法,比如len()里面可能有__len__这个方法
# __名字__
# 类中的特殊方法\内置方法
# 双下方法
# 魔术方法 magic_method
# 类中的每一个双下方法都有它自己的特殊意义 1.__call__
# class A:
# def __call__(self, *args, **kwargs):
# print('执行call方法了')
# def call(self):
# print('执行call方法了')
# class B:
# def __init__(self,cls):
# print('在实例化A之前做一些事情')
# self.a = cls()
# self.a()
# print('在实例化A之后做一些事情')
# a = A()
# a() # 对象() == 相当于调用__call__方法
# a.call()#就调用类里面的__call__方法了
# A()() # 类名()() ,相当于先实例化得到一个对象,再对对象(),==>和上面的结果一样,相当于调用__call__方法
# B(A)
2.__len__
# 内置函数和类的内置方法是由奸情的
# class My:
# def __init__(self,s):
# self.s = s
# def __len__(self):
# return len(self.s)
# my = My('abc')
# print(len(my))
3.__new__
# class Single:
# def __new__(cls, *args, **kwargs):
# obj=object.__new__(cls)
# print('在new方法里',obj)
# return obj
# def __init__(self):
# print('在init方法里',self)
#执行顺序
#1.开辟一个空间,属于对象的
#2.把对象的空间传给self,执行init
#3.将这个对象的空间返回给调用者
#new 方法在什么时候执行?
#在实例化对象之后,__init__之前先执行__new__来创建一块空间 单例类,背下来面试题
class Single:
__isinstance=None
def __new__(cls, *args, **kwargs):
if not cls.__isinstance:
cls.__isinstance=object.__new__(cls)
return cls.__isinstance
def __init__(self,name,age):
self.name=name
self.age=age
print( self) a=Single('aaa',56)
b=Single('sdf',55)
print(a.name)
只要前面实例化一个对象,就会开辟一个内存空间。后面的实例化对象不能开辟新的内存空间,后面的对象传进去的参数会覆盖前面对象的参数。
python day21 ——面向对像-反射 getattr,内置方法的更多相关文章
- python 面向对象之反射及内置方法
面向对象之反射及内置方法 一.静态方法(staticmethod)和类方法(classmethod) 类方法:有个默认参数cls,并且可以直接用类名去调用,可以与类属性交互(也就是可以使用类属性) 静 ...
- Python反射和内置方法(双下方法)
Python反射和内置方法(双下方法) 一.反射 什么是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发 ...
- 面向对象(五)——isinstance与issubclass、反射、内置方法
isinstance与issubclass.反射.内置方法 一.isinstance与issubclass方法 1.isinstance是用来判断对象是否是某个类 isinstance(obj,cla ...
- Python学习day08-python进阶(2)-内置方法
Python学习day08-python进阶(2)-内置方法 列表数据类型内置方法 作用 描述多个值,比如爱好 定义方法 xxxxxxxxxx 2 1 hobby_list ...
- python面向编程;类的绑定与非绑定方法、反射、内置方法
一.类的绑定与非绑定方法 ''' 类中定义函数分为了两大类: 1. 绑定方法 特殊之处: 绑定给谁就应该由谁来调用,谁来调用就会将谁当做第一个参数自动传入 绑定给对象的方法: 在类中定义函数没有被任何 ...
- python面向对象 : 反射和内置方法
一. 反射 1. isinstance()和issubclass() isinstance( 对象名, 类名) : 判断对象所属关系,包括父类 (注:type(对象名) is 类名 : 判断对象所属 ...
- Python之路(第二十五篇) 面向对象初级:反射、内置方法
[TOC] 一.反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它 ...
- 《Python》反射、内置方法(__str__,__repr__)
一.反射 通过字符串的形式操作对象相关的属性.(使用字符串数据类型的变量名来获取这个变量的值) Python中的一切事物都是对象(都可以使用反射) 反射类中的变量 反射对象中的变量 反射模板中的变量 ...
- python 反射和内置方法
一.isinstance和issubclass class Foo: pass class Son(Foo): pass s = Son() #判断一个对象是不是这个类的对象,传两个参数(对象,类) ...
随机推荐
- Twisted简介
Twisted是用Python实现的基于事件驱动的网络引擎框架,Twisted支持许多常见的传输及应用层协议,包括TCP.UDP.SSL/TLS.HTTP.IMAP.SSH.IRC以及FTP.就像Py ...
- 判断(if)语句
目标 开发中的应用场景 if语句体验 if语句进阶 综合应用 一 开发中的应用场景 转换成代码 判断的定义 如果 条件满足,才能做某件事 如果 条件不满足,就做另外一件事,或者什么也不做 判断语句 又 ...
- Node.js基础学习一之Get请求
本人从事的是前端开发,这段时间公司开发项目比较少所以就想着学点东西,然后就想到了Node.js ,跟着菜鸟教程学了点,不过我觉得最好的学习方法是带着需求来学习. 其实和服务端打交道无非就是能有一个可以 ...
- RESTful API 设计指南-阮一峰
作者: 阮一峰 日期: 2014年5月22日 网络应用程序,分为前端和后端两个部分.当前的发展趋势,就是前端设备层出不穷(手机.平板.桌面电脑.其他专用设备......). 因此,必须有一种统一的机制 ...
- 尚硅谷面试第一季-18ES与Solr的区别
背景:它们都是基于Lucene搜索服务器基础之上开发,一款优秀的,高性能的企业级搜索服务器.[是因为他们都是基于分词技术构建的倒排索引的方式进行查询] 开发语言:Java语言开发 诞生时间:Solr ...
- 清除wnTKYg 这个挖矿工木马的过程讲述
由于工作需要,我由一个专业java开发工程师,渐渐的也成为了不专业的资深的运维工程师了.感慨一番,书归正传,下面就讲解wnTKYg如何清除.最近项目在做性能测试,发现CPU使用率异常,无人访问时CPU ...
- 通过Python计算一个文件夹大小
在进行计算一个文件夹内容大小的时候,我们要考虑文件夹内都有什么内容,可能都是一个一个的单文件,也有可能都是子文件夹,或者二者都有,既然要计算整个文件夹的大小,我们当然要计算每一个文件的大小以及每一个子 ...
- Intellj IDEA光标问题
Intellj IDEA光标为insert状态,无法删除内容以前用得是社区版的IDEA,今天装了14版本的,结果导入项目后,发现打开java文件的光标是win系统下按了insert键后的那种宽的光标, ...
- 3rd,Python登录模拟
需求: 1. 用户输入帐号密码进行登陆 2. 用户信息保存在文件内 3. 用户密码输入错误三次后锁定用户 #导入getpass库,用于密码验证 import getpass #定义用户名.密码 _us ...
- perl常用总结
1. #!usr/bin/perl use warnings; use strict; use Getopt::Long; use File::Basename; use PerIO::gzip; ...