python3.6入门到高阶(全栈) day018 反射

今日主要内容
1. issubclass, type, isinstance
issubclass 判断xxx类是否是xxx类的子类
type 获取到xxx对象的类型
isinstance 判断xxx对象是否是xxx类型的(向上判断)
        # class Foo(object):
        #     pass
        #
        # class Bar(Foo):
        #     pass
        #
        # class FooBar(Bar):
        #     pass

        # print(issubclass(Bar, Foo)) # True
        # print(issubclass(Foo, Bar)) # False
        # print(issubclass(FooBar, Foo)) # True 可以隔代判断


        # print(issubclass(Foo, object))
        # print(issubclass(Bar, object))
        # print(issubclass(FooBar, object))

        # object是所有类的根. 面向对象的祖宗

        # print(type("你好")) # <class 'str'> 返回该对象的数据类型

        # class Animal:
        #     pass
        #
        # class Cat(Animal):
        #     pass
        #
        # c = Cat()
        #
        # print(type(c)) # 可以精准的返回数据类型

        # 计算a+b的结果 数学运算
        # def cul(a, b):
        #     if (type(a) == int or type(a) == float) and (type(b) == int or type(b) == float):
        #         return a + b
        #     else:
        #         print("不行. 不能帮你计算")
        #
        # print(cul(10, "瓦罐汤"))

        # isinstance 判断xxx对象是否是xxx类型的
        # class Animal:
        #     pass
        #
        # class Cat(Animal): # x是一种y. x继承y
        #     pass
        #
        # class BosiCat(Cat):
        #     pass
        #
        # kitty = Cat()
        # print(isinstance(kitty, BosiCat)) # True  xxx是否是一种xxxx(包括对象的父类)
        # # type()
        # print(type(kitty) == Animal) # False
View Code

2. 如何判断一个方法或者一个函数(FunctionType, MethodType)
from types import FunctionType, MethodType
print(isinstance(xx, FunctionType))) # 查看判断函数
print(isinstance(xx, MethodType))) # 查看判断方法
   from types import FunctionType, MethodType

        class Car:
            def run(self): # 实例方法
                print("我是车, 我会跑")

            @staticmethod
            def cul():
                print("我会计算")

            @classmethod
            def jump(cls):
                print("我会jump")


        # 实例方法:
        #     1. 用对象.方法   方法
        #     2. 类名.方法     函数
        c = Car()
        # print(isinstance(c.run, FunctionType)) # False
        # print(isinstance(Car.run, FunctionType)) # True
        # print(isinstance(c.run, MethodType)) # True
        # print(isinstance(Car.run, MethodType)) # False

        # 静态方法 都是函数
        # print(isinstance(c.cul, FunctionType)) # True
        # print(isinstance(Car.cul, FunctionType)) # True
        # print(isinstance(c.cul, MethodType)) # False
        # print(isinstance(Car.cul, MethodType)) # False

        # 类方法都是方法
        print(isinstance(c.jump, FunctionType)) # False
        print(isinstance(Car.jump, FunctionType)) # False
        print(isinstance(c.jump, MethodType)) # True
        print(isinstance(Car.jump, MethodType)) # True
View Code
    结论 :
1. 实例方法:
用类名访问. 函数
用对象访问. 方法
2. 静态方法
都是函数
3. 类方法
都是方法

3. 反射(重点)
hasattr(对象, 属性(字符串))
hasattr()⽤来判断xxx中是否包含了xxx功能
getattr(对象, 属性(字符串)) 从对象中获取到xxx属性

setattr(对象, 属性, 值)
delattr(对象, 属性) 从对象中删除xxx属性
例  前段
        def chi():
        print("大牛很能吃")

        def he():
            print("大牛很能喝")
        def la():
            print("大牛很能啦")
        def shui():
            print("大牛一般不睡觉")
        def sa():
            print("大牛忘了撒")

        def play():
            print("大牛很喜欢玩儿")
        play()
        name = "张二蛋"
        print("wife")

        后段
        # import master

        # print(getattr(master, "name"))
        # setattr(master, "name", "张全蛋")
        # print(master.name)
        # setattr(master, "wife", "毛蛋")
        # print(master.wife)

        # def chi():
        #     print("大牛说的不对. 应该慢慢吃")
        #
        # # 给xxx模块中的chi替换成我的chi. 和字典一样
        # setattr(master, "chi", chi)
        #
        # delattr(master, "la") # 动态的删除一些内容
        #
        # while 1:
        #     s = input("请输入你要测试的功能") #  chi he la sa
        #
        #     # 从模块中获取到chi
        #     if hasattr(master, s): # name 判断xxx中是否包含xxx功能
        #         fn = getattr(master, s) # 从xxx中获取到xxx功能
        #         fn()
        #     else:
        #         print("没有这个功能")

        # setattr(master, "chi", "馒头")
        # print(master.chi)
        # setattr(对象, 属性(字符串形式),  值) attribute  属性   对象中的属性
        # getattr(对象, 属性(字符串形式) )
        # delattr(对象, 属性) 从对象中删除一个属性
        # hasattr(对象, 属性) 判断对象中会否有xxx属性
        # getattr(master, "name")
        # getattr(master, "chi")
        # class Car:
        #     pass
        # c = Car()
        # print(c.color)

        # class Car:
        #     def __init__(self, color, pai, price):
        #         self.color = color
        #         self.pai = pai
        #         self.price = price
        #
        #     def fly(self):
        #         print("我的车会飞")
        #
        # c = Car("黄色", "兰博基尼", 188888)
        # # delattr(Car, "fly") # 可以操纵我们的类或者对象
        # # c.fly()
        #
        # # setattr(Car, "fly", lambda self:print("我的天啊. 我的车居然会飞"))
        # # c.fly()
        #
        # print(c.color)
        # setattr(c, 'color', "黑色")
        # print(c.color)
        #
        # print(getattr(c, "pai"))
        # print(c.pai)
View Code
4. md5加密
import hashlib
obj = hashlib.md5(加盐)
obj.update(铭文的bytes)
obj.hexdigest() 获取密文
# md5特点: 不可逆的一种加密方式
        # 最多用在密码加密上
        # cs  alex - 534b44a19bf18d20b71ecc4eb77c572f

        import hashlib

        SALT = b"abcdefghijklmnjklsfdafjklsdjfklsjdak"
        #
        # 创建md5的对象
        obj = hashlib.md5(SALT) # 加盐
        # 给obj设置铭文
        obj.update("alex".encode("utf-8"))
        # 获取到密文
        miwen = obj.hexdigest()
                     # f4c17d1de5723a61286172fd4df5cb83
                     # 534b44a19bf18d20b71ecc4eb77c572f
        print(miwen) # 534b44a19bf18d20b71ecc4eb77c572f

        # md5使用
        def jiami(content):
            obj = hashlib.md5(SALT)
            obj.update(content.encode("utf-8"))
            return obj.hexdigest()

        # 注册
        # username = input("请输入你的用户名:")   # alex
        # password = input("请输入你的密码:")
        # password = jiami(password) # c3d4fe3dce88533a8b50cf2e9387c66d
        # print(password)


        uname = "alex"
        upwd = "c3d4fe3dce88533a8b50cf2e9387c66d"

        username = input("请输入你的用户名:")
        password = input("请输入你的密码:")

        if uname == username and upwd == jiami(password):
            print("登录成功")
        else:
            print("失败")
View Code

 

 
 
posted @ 2018-11-09 17:39  曾经有个贵族  阅读(131)  评论(0编辑  收藏  举报