类的成员、嵌套
成员分类:变量、方法、属性
一、变量
1、变量分类变量和实例变量
1 class Foo: 2 # 类变量(静态字段) 3 country = "中国" 4 5 def __init__(self, name): 6 # 实例变量(字段) 7 self.name = name 8 9 def func(self): 10 pass
准则:实例变量访问时,使用对象访问,类变量访问时,使用类方法访问
当所有对象中有共同的字段时且要改都改要删都删时,可以将 实例变量(字段) 提取到 类变量(静态字段)
常见的访问类型
1 obj1 = Foo('张华') 2 obj2 = Foo('王东') 3 4 #易错点1 5 obj1.name = 'Tom' 6 print(obj1.name) # Tom 7 print(obj2.name) # 王东 8 9 #易错点2 10 obj1.country = '美国' 11 print(obj1.country) # 美国 12 print(obj2.country) # 中国 13 14 #易错点3 15 Foo.country = '美国' 16 print(obj1.country) # 美国 17 print(obj2.country) # 美国
2、公有变量和私有变量
1、公有实例变量
1 class Foo: 2 3 def __init__(self,name): 4 self.name = name 5 self.age = 123 6 7 def func(self): 8 print(self.name) 9 10 11 obj = Foo('Bart') 12 print(obj.name) 13 print(obj.age) 14 obj.func()
2、私有实例变量 私有实例变量可以通过内部访问
1 class Foo: 2 3 def __init__(self,name): 4 # 私有实例变量(私有字段) 5 self.__name = name 6 self.age = 123 7 8 def func(self): 9 print(self.__name) 10 11 obj = Foo('张**') 12 print(obj.age) 13 #obj.__name # 无法访问 14 obj.func() # 找一个内部人:func, 让func帮助你执行内部私有 __name
3、公有类变量
1 class Foo: 2 country = "中国" 3 4 def __init__(self): 5 pass 6 7 def func(self): 8 # 内部调用 9 print(self.country) 10 print(Foo.country) # 推荐 11 12 13 # 外部调用 14 print(Foo.country) 15 16 obj = Foo() 17 obj.func()
4、私有类变量
1 class Foo: 2 __country = "中国" 3 4 def __init__(self): 5 pass 6 7 def func(self): 8 # 内部调用 9 print(self.__country) 10 print(Foo.__country) # 推荐 11 12 # 外部无法调用私有类变量 13 # print(Foo.country) 14 15 obj = Foo() 16 obj.func()
二、方法
1、实例方法
1 class Foo(object): 2 def __init__(self, name): 3 self.name = name 4 5 def func(self): 6 print(self.name) 7 8 9 obj = Foo('史**') 10 obj.func()
2、静态方法
1 class Foo(object): 2 def __init__(self, name): 3 self.name = name 4 5 # 实例方法 6 def func(self): 7 print(self.name) 8 9 # 静态方法,如果方法无需使用对象中封装的值,那么就可以使用静态方法 10 @staticmethod 11 def display(a1,a2): 12 return a1 + a2 13 14 obj = Foo('Tom') 15 obj.func() 16 17 ret = Foo.display(1,3) 18 print(ret)
总结:
1,静态方法参数可有可无 。
2,方法的调用 类.方法名()/对象.方法名
3,在无需调用对象中封装的值时,可以选择静态方法
3、类方法
1 class Foo(object): 2 def __init__(self, name): 3 self.name = name 4 5 # 实例方法,self是对象 6 def func(self): 7 print(self.name) 8 9 # 静态方法,如果方法无需使用对象中封装的值,那么就可以使用静态方法 10 @staticmethod 11 def display(a1,a2): 12 return a1 + a2 13 14 # 类方法,cls是类 15 @classmethod 16 def show(cls,x1,x2): 17 print(cls,x1,x2) 18 19 # 执行类方法 20 Foo.show(1,8)
总结:
1类方法的参数至少有一个cls参数
2执行时类名.方法名() # 默认会将当前类传到参数中.
3如果在方法中会使用到当前类,那么就可以使用类方法.
4、私有的实例方法
1 class Foo(object): 2 3 4 def __init__(self): 5 pass 6 7 8 def __display(self,arg): 9 print('私有方法',arg) 10 11 def func(self): 12 self.__display(123) 13 14 obj = Foo() 15 # obj.__display(123) # 无法访问 16 obj.func()
5、私有的静态方法
1 class Foo(object): 2 3 4 def __init__(self): 5 pass 6 7 @staticmethod 8 def __display(arg): 9 print('私有静态 方法',arg) 10 11 def func(self): 12 Foo.__display(123) 13 14 @staticmethod 15 def get_display(): 16 Foo.__display(888) 17 18 # Foo.__display(123) 报错 19 20 obj = Foo() 21 obj.func() 22 23 Foo.get_display()
三、属性,属性可以看做是由实例方法变种而来
1 class Foo(object): 2 def __init__(self): 3 pass 4 5 @property 6 def start(self): 7 return 1 8 9 @property 10 def end(self): 11 return 10 12 13 obj = Foo() 14 print(obj.start) 15 print(obj.end)
总结:
1方法参数:只有一个self
2调用时:无需加括号 对象.方法
3应用场景: 对于简单的方法,当无需传参且有返回值时,可以使用 @property
四、嵌套
1 class School(object): 2 def __init__(self, name, address): 3 self.name = name 4 self.address = address 5 6 def speech(self): 7 print('讲课') 8 9 obj1 = School('北京校区', '海淀区') 10 obj2 = School('上海校区', '浦东新区') 11 obj3 = School('深圳校区', '南山区') 12 class Teacher(object): 13 def __init__(self, name, age, salary): 14 self.name = name 15 self.age = age 16 self.__salary = salary 17 self.school = None 18 19 t1 = Teacher("Alent", 19, 188888) 20 t2 = Teacher('Bart', 18, 60) 21 t3 = Teacher('Tom',16, 900000) 22 # ############## 老师分配校区 23 t1.school = obj1 24 t2.school = obj1 25 t3.school = obj2 26 # #################################### 27 # 查看t1老师,所在的校区名称/地址 28 print(t1.school.name) 29 print(t1.school.address) 30 print(t1.name) 31 print(t1.age) 32 t1.school.speech()