面向对象再进阶

Posted systemsystem

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面向对象再进阶相关的知识,希望对你有一定的参考价值。

  • 封装在继承中的情况
  • 反射
  • 装饰器
‘‘‘子类不能继承父类的私有方法‘‘‘
‘‘‘
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
‘‘‘

# 三   反射
# 什么意思呢 :你希望能够通过这个字符串-->程序中的变量名(类名函数变量名方法名对象名)
# 例如:

# 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() # 如果是方法就返回方法 调用的时候加括号

 

以上是关于面向对象再进阶的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段——JS中的面向对象编程

VSCode自定义代码片段9——JS中的面向对象编程

面向对象进阶

面向对象进阶

第七天 面向对象进阶与socket编程

面向对象进阶