类的成员可分为三大类:字段丶方法和属性
一丶字段
字段包括:普通字段和静态字段,他们在定义和使用中有所区别,而最本质的区别是内存中保存的位置不同.
普通字段属于对象
静态字段属于类
class Foo: #类变量(静态字段) country = "你好" def __init__(self,name): # 实例变量(普通字段) self.name = name def too(self): print("===========") #直接访问普通字段 obj = Foo("李白") obj.too() #直接访问静态字段 print(Foo.country)
由上述代码可以看出[普通字段需要通过对象来访问] [静态字段通过类访问],在使用上可以看出普通字段和静态字段的归属是不同的,其在内容的存储方式也不一样,静态字段在内存中只保存一份,普通字段在每个对象中都要保存一份
上面我们看到的两种字段都是公有字段,下面为私有字段
class Foo: #类变量(静态字段) country = "你好" #私有类变量(静态字段) __ctorens = "再见" def __init__(self,name,phone): # 实例变量(普通字段) self.name = name #私有示例变量(普通字段) self.__phone = phone def too(self): print(Foo.__ctorens) #直接访问普通字段 obj = Foo("李白","165136851546") obj.too() #直接访问静态字段 print(Foo.country) #在类外面是没法访问类中的私有字段的,所以这里会报错 print(Foo.ctorens)
二丶方法
方法包括普通方法丶静态方法和类方法,三种方法在内存中都归属于类,区别在于调用方式不同
1.普通方法:由对象调用,至少一个self参数,执行普通方法时,自动将调用该方法的对象赋值给self
2.类方法:由类调用,至少一个cls参数,执行类方法时,自动将调用该方法的类赋值给cls
3.静态方法:由类调用,无默认参数
# 实例方法 class Foo: def __init__(self,name): self.name = name #实例方法 def tom(self): pass obj = Foo("XX") obj.tom() #静态方法 #在方法前面加@staticmethod,方法名中的self也不用写了,可以写任何参数,调用直接用 类名.方法名(参数) 调用 class Foo: def __init__(self,name): self.name = name #静态方法,如果方法无需使用对象中封装的值,那么就可以使用静态方法 @staticmethod def tom(a,b): print(a,b) Foo.tom(1,2) # 类方法 #在方法前面加上@classmethod,方法名中参数必须有cls,cls是指类 class Foo: def __init__(self,name): self.name = name def show1(self): print(self) # 类方法 @classmethod def show(cls,a,b): print(cls,a,b) #<class '__main__.Foo'> 1 2 Foo.show(1,2)
方法跟字段一样,也分为私有跟公有,私有就是在方法名前面加上__,调用是不能在类外面直接调用,需要调用类中的一个公有方法,再在公有方法里调用私有方法
class Foo: def __init__(self,name): self.name = name def show1(self): Foo.__show(1,2) # 私有类方法 @classmethod def __show(cls,a,b): print(cls,a,b) #<class '__main__.Foo'> 1 2 obj = Foo("XX") obj.show1()
三丶属性
属性的定义时就是在普通方法的基础上添加@property装饰器,属性仅有一个self参数,调用时无需括号
class Foo(object): def __init__(self): pass #属性在方法名前面加上@property @property def start(self): return 1 obj = Foo() print(obj.start) #无需加括号,直接调用
四丶面向对象的嵌套
两个类中的变量互相建立关系就叫嵌套
class School: def __init__(self,name): self.name = name obj = School("舞蹈教室") obj1 = School("音乐教室") obj2 = School("美术教室") class Teacher: def __init__(self,name): self.name = name t = Teacher("舞蹈老师") t1 = Teacher("音乐老师") t2 = Teacher("美术老师") #############为老师分配教室 t.School = obj t1.School = obj1 t2.School = obj2 ############查看t1老师所在的教室 print(t1.School.name)