面向对象编程

面向对象编程

  • 通过类获取一个对象的过程 - 实例化

  • 类名()会自动调用类中的__init__方法

  • 类和对象之间的关系?

    • 类 是一个大范围 是一个模子 它约束了事务有哪些属性 但是不能约束具体的值
    • 对象 是一个具体的内容 是模子的产物 它遵循了类的约束 同时给属性赋上具体的值
  • 类有一个空间 存储的是定义在class中的所有名字

  • 每一个对象又拥有自己的空间 通过对象名.__dict__就可以查看这个对象的属性和值
    print(alex.name) # print(alex.dict['name']) 属性的查看
    alex.name = 'alexsb' # 属性的修改
    alex.money = 100 # 属性的增加
    del alex.money # 属性的删除

  • 练习类的创建和实例化
    d = ['k':'v']
    print(d,id(d))
    d['k'] = 'vvvv'
    print(d,id(d))

  • 修改列表\字典中的某个值,或者是对象的某一个属性 都不会影响这个对象\字典\列表所在的内存空间

    实例化所经历的步骤

      1.类名() 之后的第一个事儿:开辟一块儿内存空间
      2.调用__init__把空间的内存地址作为self参数传递到函数内部
      3.所有的这一个对象需要使用的属性都需要和self关联起来
      4.执行完init中的逻辑之后,self变量会自动的被返回到调用处(发生实例化的地方)
    
  • dog类 实现狗的属性 名字 品种 血量 攻击力 都是可以被通过实例化被定制的
    class Dog():
    def init(self,name,blood,aggr,kind):
    self.dog_name = name
    self.hp = blood
    self.ad = aggr
    self.kind = kind

    小白 = Dog('小白',5000,249,'柴犬')
    print(小白.dog_name)
    print(小白.__dict__)
    
  • 对象/实例 = 类名() => 实例化的过程

  • 对象的属性/实例变量

  • 类中的方法(函数) 有一个必须传的参数 self 对象

  • hasattr getattr setattr delattr 反射

    • 实例对象
    • 本模块 sys.modules[name]
    • 其他模块
      if hasattr(obj,'name'):
      getattr(obj,'name')
  • 找到tbjx对象 的c类 实例化一个对象
    obj = getattr(tbjx,'C')()

  • 找到tbjx对象 的c类 通过对c类这个对象使用反射取到area
    print(getattr(tbjx.C,'area'))

  • 找到tbjx对象 的c类 实例化一个对象 对对象进行反射取值
    obj = getattr(tbjx,'C')('赵海狗')
    print(obj.name)
    print(getattr(obj,'name'))

  • 一次执行多个函数
    def func1():
    print('in func1')

    func_lst = [f'func{i}' for i in range(1,5)]
    for func in func_lst:
        getattr(sys.modules[__name__],func)()
    
  • 反射应用
    class User:
    user_list = [('login','登录'),('register','注册'),('save','存储')]

        def login(self):
            print('欢迎来到登录页面')
    
        def register(self):
            print('欢迎来到注册页面')
    
        def save(self):
            print('欢迎来到存储页面')
    
    
    # choose_dic = {
    #     1: User.login,
    #     2: User.register,
    #     3: User.save,
    # }
    
    while 1:
        choose = input('请输入序号:\n1:登录\n2:注册\n3:存储\n').strip()
        obj = User()
        # choose_dic[int(choose)](obj)
        getattr(obj,obj.user_list[int(choose)-1][0])()
    # getattr(obj,obj.user_list[int(1)-1][0])()
上一篇:jekyll搭建个人博客2


下一篇:(反射+内省机制的运用)处理jdbc的结果集