zoukankan      html  css  js  c++  java
  • 7.类中方法

    类中方法 - property - 反射

    1. 类中方法

    # 类中方法
    
    class Cat():
        # 无参方法: 只能类来调用
        def pashu():
            print("小猫会爬树")
        # 绑定方法: 1.绑定到对象,对象调用类中成员方法时,会自动传递对象参数
        def eatfish(self):
            print("小猫喜欢吃鱼")
        # 绑定方法: 2.绑定到类,对象或者类调用类中成员方法时,会自动传递类参数
        @classmethod
        def sleep(cls):
            print("小猫爱睡觉")
        # 静态方法: 无论是对象还是类调用,系统都不会传递任何参数
        @staticmethod
        def jineng():
            print("可以抓耗子")
    
    obj = Cat()
    # 1. 无参方法
    # obj.pashu() 有错误
    Cat.pashu() #小猫会爬树
    
    # 2. 绑定到对象(对象调用自动传对象参数)
    obj.eatfish() #小猫喜欢吃鱼
    Cat.eatfish(obj) #小猫喜欢吃鱼
    
    # 3.绑定到类(自动传递类参数)
    obj.sleep() #小猫爱睡觉
    Cat.sleep() #小猫爱睡觉
    
    # 4.静态方法 (不传递任何参数)
    obj.jineng() #可以抓耗子
    Cat.jineng() #可以抓耗子
    

    2. property

    # property
    """
    作用 : 可以把方法变成属性,动态的控制了该属性的获取,设置,删除三种操作;
    
    获取数据时自动触发装饰器 @property
    设置属性时自动触发装饰器 @函数名.setter
    删除属性时自动触发装饰器 @函数名.deleter
    
    要求: 获取,设置,删除的函数名必须一致,
    """
    # 1.方法一:
    class My():
        def __init__(self,name):
            self.name = name
        @property
        def func(self):
            return self.name
        @func.setter
        def func(self,name):
            self.name = name
        @func.deleter
        def func(self):
            del self.name
    
    obj = My("贾英贺") #实例化对象
    # print(obj.name) 
    # 获取元素
    print(obj.func) #贾英贺
     # 设置元素
    obj.func = "光头强"
    print(obj.func) #光头强
    # 删除元素
    del obj.func
    # print(obj.func) error
    
    # 方法二:
    
    class Me():
        def __init__(self,name):
            self.name = name
        def get(self): #获取元素
            return self.name
        def sett(self,val): #设置元素
            self.name = val
        def dele(self): #删除元素
            del self.name
        # 必须按照顺序传参 :获取方法 ->设置方法 ->删除方法
        username = property(get,sett,dele)
    
    obj = Me("熊大")
    print(obj.username)
    obj.username = "吉吉"
    print(obj.username)
    del obj.username
    # print(obj.username) error
    

    3. 反射

    # 反射
    """
    概念 : 通过字符串取操控类对象,或者模块中的属性方法
    """
    # 1.放射类对象中的成员
    class My():
        age = 11
    
        def __init__(self, name):
            self.name = name
    
        def skin(self):
            print("肤色号")
    
        def eye(self):
            print("眼睛好")
    
        def __eat(self):
            print(888)
    
    
    obj = My("贾英贺")
    # (1) hasattr(object,name) 检测对象或类是否有指定的成员(判断依据:查看是否可以被调用)
    print(hasattr(obj, "name"))     # True
    print(hasattr(obj, "__eat"))    # False 对象不能调用类中私有方法
    print(hasattr(My, "age"))       # True
    
    # (2) getattr() 获取对象或类成员的值
    print(getattr(obj,"name"))
    # getattr(类/对象,成员,"设置默认值防止报错")
    print(getattr(obj,"djl","出错了"))
    
    # 通过类反射方法(反射出来的是普通函数)
    func = getattr(My,"skin")
    func(obj) # 调用时需要看类中方法是否有参数,有的话需要传递参数
    
    # 通过对象反射方法(反射出来的是绑定方法)
    func = getattr(obj,"eye")
    func()
    
    # (3) setattr() 设置对象或类成员的值
    setattr(obj,"sex","未知") # 对象添加属性
    print(obj.sex)
    
    def func():              # 对象添加方法
        print('aaaaaaa')
    setattr(obj,'hehe',func)
    obj.hehe()
    
    setattr(My,"hh",lambda self:print("大家快来示范")) # 类添加方法
    obj.hh()
    
    # (4) delattr() 删除对象或类成员的值
    delattr(My,"hh")
    delattr(obj,"name")
    
    # 实例:通过字符串操作对象或类中的成员
    """
    strvar = input("你想要调用的方法:")
    if hasattr(obj,strvar):
        func = getattr(obj,strvar)
        func()
    else:
        print("该方法不存在")
    """
    
    # 2.反射模块中的成员
    
    import sys
    # sys.modules 返回的是系统的模块字典
    print(sys.modules)
    # 通过__main__字典的键,获取的是当前文件的模块对象
    modules = sys.modules["__main__"]
    
    def func1():
        print(1111)
    def func2():
        print(2222)
    def func3():
        print(33333)
        
    # 反射模块实例:通过字符串操作模块成员
    while True:
        strvar = input("请输入您想要使用的方法名:")
        if hasattr(modules,strvar):
            func = getattr(modules,strvar)
            func()
        elif strvar.upper() == "Q":
            break
        else:
            print("没有该方法")
    
  • 相关阅读:
    轻松搭建CAS 5.x系列(7)-在CAS Server使用第三方帐号做认证
    轻松搭建CAS 5.x系列(6)-在CAS Server上增加OAuth2.0协议
    轻松搭建CAS 5.x系列(5)-增加密码找回和密码修改功能
    CAS 5.x搭建常见问题系列(3).Failure to find org.apereo.cas:cas-server-support-pm-jdbc:jar:5.1.9
    CAS 5.x搭建常见问题系列(2).PKIX path building failed
    CAS 5.x搭建常见问题系列(1).未认证的授权服务
    轻松搭建CAS 5.x系列(4)-Java客户端程序接入CAS单点登录,Hello World版
    轻松搭建CAS 5.x系列文章
    CAS实现SSO单点登录-CAS Server 5.3搭建 cas5.3搭建 cas5.3去除https cas 去除https cas 5.x 去除https
    互联网大咖都要收藏的几个网站,纯干货
  • 原文地址:https://www.cnblogs.com/jia-shu/p/14176270.html
Copyright © 2011-2022 走看看