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()
代码运行结果为: