18面向对象--成员和组合

1、成员的分类:

  1、变量

    类变量:顾名思义就是类中的变量

    实例变量:顾名思义就是实例化对象中的变量(__init__初始化的是实例变量)

 1 # 区分实例变量和类变量
 2 # 通过题目加深理解
 3 class StarkConfig(object):
 4 
 5     def __init__(self):
 6        self.list_display = []
 7 
 8     def get_list_display(self):
 9         self.list_display.insert(0, 33)
10         return self.list_display
11 
12 
13 class RoleConfig(StarkConfig):
14     list_display = [11, 22]
15 
16 
17 s1 = StarkConfig()    # 需要理解。这里的list是实例变量而不是类变量。
18 
19 result1 = s1.get_list_display()
20 result2 = s1.get_list_display()
21 
22 
23 
24 '''
25 ------------------------------------------------------
26 '''
27 class StarkConfig2(object):
28     list_display = []
29 
30     def get_list_display(self):
31         self.list_display.insert(0, 33)
32         return self.list_display
33 
34 
35 class RoleConfig2(StarkConfig):
36     list_display = [11, 22]
37 
38 
39 s1 = RoleConfig2()
40 s2 = RoleConfig2()
41 
42 
43 result3 = s1.get_list_display()
44 print(result1)
45 
46 result4 = s2.get_list_display()
47 print(result2)

   如果能正确判断输出,估计就琢磨的差不多了

  2、方法

    实例方法:     

      需要调用构造方法初始化的值的时候使用(说白点就是要传参的) ---需要实例化调用
      def fun1(self):
        print(self.paral)

    静态方法:    

      静态方法需要在方法前面加@staticmethod装饰器
      如果方法中无需使用对象中封装的值,那么就可以使用静态方法(不用传参数的,传也不报错) ---可直接类调用
      @staticmethod
      def func2(para3):
        print(para3)

    类方法:

      类方法需要在方法前面加@classmethod装饰器
      实例方法中的self指向的是对象,而类方法中自带的cls则指向的是类。
      @classmethod
      def fun3(cls, para4):
        print(cls, para4)

    #方法的公有和私有(不算多重要):

      方法默认都是公共的。如果要改成私有方法。方法名前加两个下划线即可。私有方法无法继承。

  3、属性

    将方法变成属性。方法前面加@property装饰器。然后调用的时候不需要在方法后面加括号。

 

2、组合(嵌套):

  关于组合需要注意两点:

    1、对象中封装的东西

    2、以及self的指向

#判断打印结果1.0
class StarkConfig(object):

    def __init__(self, num):
        self.num = num

    def changelist(self, request):
        print(self.num, request)

    def run(self):
        self.changelist(999)


class RoleConfig(StarkConfig):

    def changelist(self, request):
        print(666, self.num)


class AdminSite(object):

    def __init__(self):
        self._registry = {}

    def register(self, k, v):
        self._registry[k] = v


site = AdminSite()
site.register('语文', StarkConfig(19))
site.register('数学', StarkConfig(20))
site.register('英语', RoleConfig(33))

for amd, row in site._registry.items():
    row.run()

    代码运行结果为:

     

    

posted @ 2019-07-21 02:47  John.Liu-  阅读(212)  评论(0编辑  收藏  举报