zoukankan      html  css  js  c++  java
  • 面向对象再进阶

    • 封装在继承中的情况
    • 反射
    • 装饰器
    '''子类不能继承父类的私有方法'''
    '''
    class Son(object):
        A=123
        __AB=234
        # print(__AB) # 只能在内部查看,内部会自动翻译成 '_Son__AB': 234, 也就是_类名__AB
    # print(Son.__AB)  # 报错 私有属性不能在外部查看
    
    # print(Son.__dict__) # 查看所有静态属性
    
    
    class Foo(Son):
        def func(self):
            print(Foo.A) # 子类没有找父类 所以打印结果为 123
            # print(Son.__AB)   当前类(就是你在谁那就会变成谁的)会自动帮你翻译成_Foo__AB会自动加上类名,这样的东西在父类中是没有的,所以他会报错.
    
    print(Foo().func())
    
    # __这个变量出现在哪个类中,就会在变形的时候 加上这个类的类名
    # 所以在子类中使用私有的名字,会加上子类的名字
    # 这样就不可能调用加上了父类名字的静态变量了'''
    
    # class Foo(object):
    #     def __init__(self):
    #         self.__func() # 此时翻译为_Foo__func
    #     def __func(self):
    #         print('你好')  # 所以打印的是这个
    #     def func(self):
    #         print('你不好')
    # class Son(Foo):
    #     def __func(self):
    #         print('不好')
    #     def func(self):
    #         print('')
    # Son()
    # print(Foo.__dict__)
    '''
    调用私有的方法或者属性
        不需要考虑self是谁的对象
        只要是私有的方法或者属性,就一定是在调用的当前类中执行方法
    当某个方法或者属性,不希望被子类继承的时候,也可以把这个方法属性定义为私有成员
       '''
    # 二   类中的几个装饰器函数
    
    # class A:
    #     __count=0
    #     def __init__(self,name):
    #         self.name=name
    #         self.__add_count()
    #     # def __add_count(self): # 常规写法,但是写完之后你会发现,这个作用根本就用不到self,也就没有对象什么事(不需要这个self参数)
    #     #     A.__count+=1
    #     @classmethod  # 类方法
    #     def __add_count(cls): # 顺便说 定义一个私有方法,目的是让这个方法在类的内部使用
    #         cls.__count+=1    # 相当于类名点方法了
    #     @classmethod
    #     def show_count(cls):
    #         return cls.__count # 让用户从外部查看__count的值
    #
    # print(A(33).show_count()) #对象操作方法
    # print(A.show_count()) # 类名直接操作方法
    '''
    # 在类中会有一种情况,就是这个方法并不需要使用某一个对象的属性
    # 因此这个方法中的self完全是一个没用的参数
    # show_count是一个查看类中属性的方法,这样的方法和某一个对象并没有直接联系
    # 本质上,一个方法不使用对象属性,但使用静态属性---就是类方法@classmothd
    # 调用这个方法,可以使用对象调用,也可以是用类调用
    # 但是这个方法的默认参数永远是当前类的名称空间,而不是对象的
    '''
    
    # (2)
    # 如果一个类中的方法不用对象属性也不用静态属性__就是静态方法@staticmethod
    # 那实际上这个方法就是一个普通的函数
    
    # 那综上所述大体总结:
    '''                             普通方法                类方法                 静态方法
    默认参数                        self                    cls                     无
    操作的变量                       操作对象的属性         操作静态属性              既不操作对象属性,也不操作类属性
    所属的命名空间                    类                    类                       类
    调用方式                          对象调用              类或对象                    类/对象
    对应的装饰器                      无                      @ classmethod            @staticmethod
    '''
    
    # 三   反射(hasattr,getattr,setattr,delattr)
    # 什么意思呢 :你希望能够通过这个字符串-->程序中的变量名(类名函数变量名方法名对象名)
    # 例如:
    
    # class Person:
    #     role = '人类'
    #     Country = '中国'
    #
    # attr = input('>>>')  # role 人类
    #                    # Country 中国
    # print(getattr(Person,'role'))
    # print(getattr(Person,'Country'))
    # if hasattr(Person,attr):
    #     print(getattr(Person,attr)) # 把你所获取到的字符串变成代码
    
      # 所有 的a点b都可以被反射成getattr(a,"b")
    # 反射中的方法
    class Person():
        role='人类'
        @staticmethod
        def show_courses():
            print('所偶有课成')
    # Person.role==getattr(Person,'role') # 这句仅仅是判断他是不是等于他
    
    # print(Person.role)
    print(getattr(Person,'role'))
    # Person.show_courses() == getattr(Person,'show_courses')()
    ret = getattr(Person,'show_courses')
    ret() # 如果是方法就返回方法 调用的时候加括号
  • 相关阅读:
    程序自动更新版本
    [.NET] Rough Dependency Injection
    Python标准库存储对象(pickle包,cPickle包)
    发送邮件,支持群发
    css3传送带示例
    “计算机之子”的MVVM框架源码学习笔记
    Windows 8 应用商店正式面向全部开发者开放
    MVVM框架 v1发布
    Python学习索引
    注册 windows 8 开发者账号
  • 原文地址:https://www.cnblogs.com/systemsystem/p/10026465.html
Copyright © 2011-2022 走看看