zoukankan      html  css  js  c++  java
  • python's twenty-third day for me 面向对象进阶

    普通方法:对象和类绑定的过程。

    class A:
        def func1(self):pass
        def func2(self):pass
        def func3(self):pass
        def func4(self):pass
    
    a = A()
    b = A()
    print(A.func1)      # <function A.func1 at 0x00000217A0BE3400>
    print(a.func1)      # <bound method A.func1 of <__main__.A object at 0x00000217A0CF9EB8>>
    print(b.func1)      # <bound method A.func1 of <__main__.A object at 0x00000217A0CFF080>>

    类方法:由于不适用对象内存空间的属性所以不会将对象和方法绑在一起。而是将类和方法绑在一起。

    class A:
        def func1(self):pass
        @classmethod
        def func2(cls):pass
        def func3(self):pass
        def func4(self):pass
    
    a = A()
    b = A()
    print(A.func2)      # <bound method A.func2 of <class '__main__.A'>>
    print(a.func2)      # <bound method A.func2 of <class '__main__.A'>>
    print(b.func2)      # <bound method A.func2 of <class '__main__.A'>>
    
    #  对象能找到类,类里面绑着方法。

    静态方法:不是绑定方法,没有和对象或者类发生任何绑定关系。

    class A:
        def func1(self):pass
        @classmethod
        def func2(cls):pass
        def func3(self):pass
        @staticmethod
        def func4(self):pass
    
    a = A()
    b = A()
    print(A.func4)      # <function A.func4 at 0x000002BE409837B8>
    print(a.func4)      # <function A.func4 at 0x000002BE409837B8>
    print(b.func4)      # <function A.func4 at 0x000002BE409837B8>
    
    #  没有绑定  : 并没有 bound method  

    isinstance:能够检测到继承关系。判断一个对象和一个类有没有血缘关系。isinstance(对象名,类名)。

    #  能够检测到继承的关系。
    class A:pass
    class B(A):pass
    class C(B):pass
    c = C()
    print(isinstance(c,C))      # True
    print(isinstance(c,B))      # True
    print(isinstance(c,A))      # True
    
    # type 只是单纯的判断类
    print(type(c) is C)     # True
    print(type(c) is B)     # False
    print(type(c) is A)     # False

    issubclass:可以查看是否存在继承关系。

    # issubclasss(子类名,父类名) 返回bool值。
    class A:pass
    class B(A):pass
    class C(B):pass
    print(issubclass(B,A))      # True
    print(issubclass(C,B))      # True
    print(issubclass(C,A))      # True

    反射:

      反射的4个内置函数:1,getattr  2,hasattr  3,setattr  4,delattr

      正常情况下,如果可以拿到这个变量,那么如有这个变量的字符串形式,就是用反射可以获取到这个值。

      概念:使用字符串数据类型的变量名,访问一个命名空间中的名字。

      找一个属性,直接就可以找到这个属性的值。

      找一个方法,找到的是这个方法的的内存地址。

    class A:
        role = 'Person'
        def func(self):
            print('*')
    # ret = input('>>>')
    # a = A()
    print(getattr(A,'role'))       # 从A的命名空间里找一个属性,直接就可以找到这个属性的值
    f = getattr(A,'func');f(1)     # 从A的命名空间找一个方法,找到的是这个方法的内存地址

    hasattr()  判断一个命名空间中有没有这个名字。

    getattr()  从命名空间中获取这个名字对应的值,如果空间里没有这个属性则会报错。

    class A:
        role = 'Person'
        def func(self):
            print('guxiaobai')
    ret = input('>>>')
    if hasattr(A,ret):
        f = getattr(A,ret)
        print(f)
        if type(f) is not str:
            f(1)  #  若是函数名则以加括号执行。
    # 其次因为是从类中寻找的所以需要传参数。若是对象中找,则不需要传参数。
    class A:
        role = 'Person'
        def func(self):
            print('guxiaobai')
    ret = input('>>>')
    a = A()
    if hasattr(a,ret):
        f = getattr(a,ret)
        print(f)
        if type(f) is not str:
            f()

    类中的反射:类可以获取类中的属性和方法。

    class A:
        role = 'Person'
        def func(self):
            print('guxiaobai')
    
    print(hasattr(A,'role'))    # True
    print(hasattr(A,'func'))    # True
    ret = input('>>>')
    if hasattr(A,ret):
        print(getattr(A,ret))
    class A:                                 
        role = 'Person'                      
        def __init__(self):                  
            self.money = 100                 
        def func(self):                      
            print('guxiaobai')               
    a = A()                                  
    print(hasattr(a,'money'))   # True       
    print(getattr(a,'money'))   # 100        
    getattr(a,'func')()         # guxiaobai 

    模块使用模块中的名字:

    import time     # 一个py文件就是一个模块
    time.time()
    print(getattr(time,'time')())

    在自己所在的模块中使用自己的名字:

      1,import sys  首先导入sys模块。

      2,getattr(sys.modules['__main__'],名字)

    def login():
        print('执行login功能')
    def register():
        print('执行register功能')
    
    import sys
    while True:
        ret = input('请输入你想执行的功能:退出输入Q/q:')
        if ret.upper() == 'Q':
            break
        if hasattr(sys.modules['__main__'],ret):
            getattr(sys.modules['__main__'],ret)()

    getattr 一定要和 hasattr 配合使用。

    setattr:修改和新建。

    class A:
        def __init__(self,name):
            self.name = name
    
        def func(self):
            print('guqingqiu')
    
    a = A('顾清秋')
    print(a.name)       # 顾清秋
    setattr(a,'name','顾小白')         # 已经存在的属性是修改。
    print(a.name)       # 顾小白
    print(a.__dict__)       # {'name': '顾小白'}
    setattr(a,'age',17)
    print(a.__dict__)       # {'age': 17, 'name': '顾小白'}
    print(a.age)  # 17      # 不存在的属性就是新建。

    setattr 如果新建方法(只能将不属于类的方法移入到类中)且格式:setattr(类名,‘方法名’,方法名)因为方法一般不存放在对象中,所以一般是类名,若是用对象调用,则 方法(形参)中必须有一个形参,否则就不需要。

    def login():
        print('执行login功能')
    class A:
        def __init__(self,name):
            self.name = name
    
        def func(self):
            print('guqingqiu')
    a = A('顾清秋')
    print(A.__dict__)
    setattr(A,'login',login)
    print(A.__dict__)
    getattr(A,'login')()       # 外部login()中不需要形参。
    getattr(a,'login')()       # 外部login(self)中需要形参,否则会报错。

    delattr:删除属性或方法,基本不用。

    class A:
        def __init__(self,name):
            self.name = name
        def func(self):
            print('guqingqiu')
    a = A('顾清秋')
    print(a.__dict__)   # {'name': '顾清秋'}
    delattr(a,'name')
    print(a.__dict__)   # {}

    内置方法:

        内置的东西都和内置方法有着千丝万缕的联系。

    class A:
        def __init__(self,name,age,sex):
            self.name = name
            self.age = age
            self.sex = sex
        def __len__(self):
            return len(self.__dict__)
    a = A('alex',35,'不详')
    print(a.__len__())  # 3
    a.hobby = '开车'
    print(a.__len__())  # 4

    字典的存储:hash

    # hash 和 __hash__关系
    class A:
        def __init__(self,name,age):
            self.name = name
            self.age = age
        def __hash__(self):
            return 0       # return 是什么就是什么值。
    a = A('alex',35)
    print(hash(a))
    print(a.__hash__())
  • 相关阅读:
    Flutter form 的表单 input
    FloatingActionButton 实现类似 闲鱼 App 底部导航凸起按钮
    Flutter 中的常见的按钮组件 以及自 定义按钮组件
    Drawer 侧边栏、以及侧边栏内 容布局
    AppBar 自定义顶部导航按钮 图标、颜色 以及 TabBar 定义顶部 Tab 切换 通过TabController 定义TabBar
    清空路由 路由替换 返回到根路由
    应对ubuntu linux图形界面卡住的方法
    [转] 一块赚零花钱
    [转]在树莓派上搭建LAMP服务
    ssh保持连接
  • 原文地址:https://www.cnblogs.com/stfei/p/8875911.html
Copyright © 2011-2022 走看看