练习38(反射,内置方法)

本文探讨了Python编程中的反射机制,介绍了如何使用内置方法动态地获取和操作类及对象的信息。通过实例解析了`__dict__`、`__methods__`等关键属性和方法的应用,进一步理解Python的动态特性。
摘要由CSDN通过智能技术生成

练习38

# 反射
# 3w 1h
# what 是什么
    # 反射 使用字符串数据类型的变量名来获取这个变量的值
# a = 1
# b = 2
# name = 'alex'

# why 为什么 三个场景
    # input
        # 用户输入得到如果是a,那么就打印1,如果输入的是b,就打印2,如果输入的是name,就打印alex
    # 文件
        # 从文件中独出的字符串,想转换成变量的名字
    # 网络
        # 将网络传输的字符串转换成变量的名字
# where 在哪用
# how 怎么用

# hasttr
# getattr

# 反射类中的变量: 静态属性,类方法,静态方法
# class Foo:
#     School = 'oldboy'
#     Country = 'china'
#     Language = 'chinese'
#     @classmethod
#     def class_method(cls):
#         print(cls.School)
#     @staticmethod
#     def static_method():
#         print('in static mehtod')
#     def wahaha(self):
#         print('wahaha')

# 条件判断实现
# print(Foo.School)
# print(Foo.Country)
# print(Foo.Language)

# 反射实现
# while 1:
#     inp = input('>>>')
#     if hasattr(Foo,inp):
#         print(getattr(Foo,inp))

# if inp == 'School':print(Foo.School)
# if inp == 'Country':print(Foo.Country)
# if inp == 'Language':print(Foo.Language)

# 解析getattr方法
# getattr(变量名:命名空间,字符串;属于这个命名空间内的变量名)
# getattr(Foo,'School') # Foo.School
# print(getattr(Foo,'class_method')) # Foo.class_method()
# getattr(Foo,'static_method')() # Foo.static_method()
# getattr(Foo,'wahaha')(1) # Foo.wahaha()
# getattr(Foo,'shuangwaiwai') Foo.shuangwaiwai
# print(hasattr(Foo,'wahaha'))
# print(hasattr(Foo,'shaungwaiwai'))


# 反射对象中的变量
# 对象属性
# 普通方法
# class Foo:
#     def __init__(self,name,age):
#         self.name = name
#         self.age = age
#
#     def eating(self):
#         print('%s is eating' % self.name)
#
# alex = Foo('alex_sb',83)
# print(getattr(alex,'name'))
# print(getattr(alex,'age'))
# getattr(alex,'eating')()


# 反射模块中的变量
import  os # os 就是一个模块
# os.rename('D:\Files\Desktop\python\python\汇总','D:\Files\Desktop\python\python\python汇总')
# getattr(os,'rename')('D:\Files\Desktop\python\python\python汇总','D:\Files\Desktop\python\python\汇总')


# 反射本文件的变量
# a = 1
# b = 2
# name = 'alex'
# def qqxing():
#     print('qqxing')

# cls.xxx
# obj.xxx
# os.xxx

# 分析过程
# import sys
# # print(sys.modules['__main__'])
# # print(sys.modules['__main__'].a)
# print([__name__]) # 变量,内置的变量
# print(sys.modules[__name__]) # 反射本文件中的变量 固定的使用这个命名空间

# 反射本文件中的变量 结论
# import sys
# print(sys.modules[__name__])
# print(getattr(sys.modules[__name__],'a'))
# print(getattr(sys.modules[__name__],'b'))
# print(getattr(sys.modules[__name__],'name'))
# getattr(sys.modules[__name__],'qqxing')()
# print(getattr(sys.modules[__name__],'Foo'))
# obj = getattr(sys.modules[__name__],'Foo')()
# print(obj)


# setattr

# class Foo:
#     Country = 'china'
# def func():
#     print('qqxing')
# Foo.School = 'oldboy'
# setattr(Foo,'School','oldboy')  # 接收三个参数 命名空间 '变量名' 变量值
# print(Foo.__dict__)
# print(getattr(Foo,'School'))
# print(Foo.School)

# setattr(Foo,'func',func) # 一般没人往空间中添加函数
# print(Foo.__dict__)
# print(Foo.func)

# delattr
# del Foo.Country
# print(Foo.__dict__)
# delattr(Foo,'Country')
# print(Foo.__dict__)

# hasattr()
# getattr()
# setattr()
# delattr()

# 反射类中的变量
# 发射对象中的变量
# 反射模块中的变量
# 反射本文件中的变量

# 用反射的场景
# input
# 网路
# 文件


# 内置方法
# 在不是需要程序来程序员定义,本身就存在在类中的方法就是内置方法
# 内置的方法通常都长这样:__名字__
# 名字: 双下方法 魔法方法 内置方法

# __init__
    # 不需要我们主动调用,而是在实例化的时候内部自动执行

# 所有的双下方法,都不需要我们直接去调用,都有另外一种自动触发它的语法

# __str__ __repr__
# class Course:
#     def __init__(self,name,period,price,teacher):
#         self.name = name
#         self.period = period
#         self.price = price
#         self.teacher = teacher
#
#     def __str__(self):
#         return 'str : %s %s %s %s' % (self.name, self.period, self.price, self.teacher)
#
#     def __repr__(self):
#         return 'repr : %s %s %s %s' % (self.name, self.period, self.price, self.teacher)
#
# course_lst = []
# python = Course('python','6 month',29800,'boss_jin')
# course_lst.append(python)
# linux = Course('linux','5 month',25800,'oldboy')
# course_lst.append(linux)
# for id,course in enumerate(course_lst,1):
#     print(id,course)
#     print('%s %s'%(id,course))
#     print(str(course))
#     print(repr(course))
#     print('%r' % course)


# 当你打印一个对象的时候    触发__str__
# 当你使用%s格式化的是否    触发__str__
# str强制转换数据类型的时候  触发__str__

# __repr__
# repr是str的备胎
# 有__str__的是否执行__str__,没有实现__str__的是否,执行__repr__
# repr(obj)内置函数对应的结果是__repr__的返回值
# 当你使用%r格式化的时候 触发__repr__

# 学生选择课程的时候,要显示所有的课程

# class Foo:
#     def __str__(self):
#         return 'Foo.str'
#     def __repr__(self):
#         return 'Foo.repr'
#
# class Son(Foo):
#     # def __str__(self):
#     #     return 'Son.str'
#
#     def __repr__(self):
#         return 'Son.repr'
#
# s1 = Son()
# print(s1)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值