成员和嵌套(组合)
成员
1.类的成员:变量,方法,属性
变量:
实例变量(字段)
公有实例变量(字段)
1 class Foo: 2 def __init__(self,name): 3 self.name = name#公有实例变量 4 5 def func(self): 6 return self.name
私有实例变量(字段)
1 class Foo: 2 def __init__(self): 3 pass 4 def __func(self): 5 print("私有实例变量") 6 7 obj = Foo() 8 obj.func()#此处无法调用
类变量(静态字段)
公有类变量(静态字段)
1 class Foo: 2 a = 1#公有类变量 3 def __init__(self): 4 pass 5 def func(self): 6 return self.a 7 8 obj = Foo() 9 print(obj.a) 10 print(Foo.a)
私有类变量(静态字段)
1 class Foo: 2 __a = 1 3 def __init__(self): 4 pass 5 def func(self): 6 print(self.a)#不能引用,错 7 8 obj = Foo() 9 obj.func()
总结:
公有实例变量可以在类的方法中使用,也可以用实例化的对象调用
私有实例变量不能在对象调用,只能在类中用其他方法调用后,再使用对象调用
公有类变量可以在类中调用,也可以用对象调用
私有类变量只能在类中使用其他方法调用,不能使用对象调用,子类也不能调用(如果必须要用,先在父类中使用方法来调用这个私有类变量,再在子类中调用这个方法)
方法:
实例方法
1 class Foo: 2 def __init__(self,name): 3 self.name = name 4 def func(self):#实例方法 5 print(self.name) 6 7 obj = Foo("abc") 8 obj.func()
静态方法
1 class Foo: 2 def __init__(self,name) 3 self.name = name 4 @staticmethod#静态方法 5 def display(a1,a2): 6 return a1 + a2 7 8 Foo.display(1,2)
#如果无需使用对象中封装的值,就可以使用静态方法
类方法
1 class Foo: 2 @classmethod 3 def show(cls,x1,x2):#默认第一个参数是类(cls) 4 print(cls,x1,x2) 5 6 ret = Foo.show(1,2) 7 print(ret)
总结:
实例方法:至少有一个参数,第一个参数必须是实例对象,默认是self
静态方法:可以没有参数,也无需使用对象中封装的值,方法上面需要加@staticmethod
类方法:至少有一个参数,第一个参数必须是类,默认是cls,方法上面需要加@classmethod
属性(通过方法改造出来):
1 class Foo: 2 def __init__(self): 3 pass 4 @property 5 def start(self): 6 return 1 7 @property 8 def end(self): 9 return 2 10 11 obj = Foo() 12 print(obj.start) 13 print(obj.end)
总结:属性编写时,方法上面写@property,方法中只有一个参数self
调用时,无需加括号,直接是对象.方法
对于简单的方法,当无需传参且有返回值时,可以使用属性
嵌套(组合):
1 class Student(object): 2 def __init__(self,name,age) 3 self.name = name 4 self.age = age 5 #创建三个人 6 obj1= Student("a",18) 7 obj2= Student("b",20) 8 obj3= Student("c",21) 9 10 class School(object): 11 def __init__(self,name,address) 12 self.name = name 13 self.address = address 14 15 #创建三个学校 16 s1 = School("学校1","北京") 17 s2 = School("学校2","上海") 18 s3 = School("学校3","深圳") 19 20 21 #给每个学生分配学校 22 obj1.school = s1 23 obj2.school = s2 24 obj3.school = s3 25 26 print(obj1.school.name) 27 print(obj2.school.name) 28 print(obj3.school.name)