一 面向对象的成员
1 面向对象的成员有三类:变量(字段),方法,属性
变量:实例变量(字段):公有实例变量,私有实例变量
类变量(静态字段):公有类变量,私有类变量
1 class Foo: 2 country='中国' 类变量(静态字段) 直接通过类访问Foo.country 3 def __init__(self,name): 4 self.name=name 实例变量(字段) 5 def func(self): 6 7 obj1=Foo('汪峰') 8 obj2=Foo('章子怡') 9 10 Foo.country 11 12 13 类变量可以通过对象调用 也可以用类调用 14 15 16 准则:实例变量(字段)访问时,使用对象访问:obj1.name 17 类变量(静态字段)访问时,用类方法,即:Foo.country(实在不方便时,才使用对象访问) 18 19 print(obj1.name) 20 print(Foo.country)
2 什么时候用类变量?
当所有对象中有共同字段时且要改都改要删都删,可以将实例变量(字段)提取到类变量(静态字段)
3 公有与私有
公有的可以内部调用 也可以外部调用
私有的只要在前面加上__就变成私有的
1 私有的实例变量(私有字段) 2 class Foo: 3 def __init__(self,name): 4 #self.name=name 公有的 5 self.__name=name 私有实例变量(私有字段) 6 self.age=12 7 def func(self): 8 print(self.__name) 内部可以访问私有的 9 10 obj=Foo('哈哈') 11 print(obj.age) 12 obj.__name #无法访问 13 obj.func() 找一个内部人员:func,让func帮助你执行内部私有__name 14 15 16 17 类变量(静态字段) 18 class Foo: 19 country='中国' #把country='中国' 改为__country='中国' 变成私有的 20 def func(self): 21 #内部调用 22 print(self.coutry) >> self.__country 23 print(Foo.country) #推荐使用类方法访问类变量 >> Foo.__country 24 #外部调用 25 print(Foo.country) #改为私有后外部不能调用 26 27 obj=Foo() 28 obj.func()
方法:(1)实例方法 (2)静态方法 (3)类方法
方法中也有公有和私有之分(成员修饰符)
1 1 实例化方法 2 class Foo(object): 3 def __init__(self,name): 4 self.name=name 5 def func(self): >>实例方法 self是对象 6 print(self.name) 7 obj=Foo() 8 obj.func() 9 10 11 12 13 2 静态方法 14 class Foo(object): 15 def __init__(self,name): 16 self.name=name 实例化对象 17 18 >>实例方法(至少有一个参数如self) 19 def func(self): 20 print(self.name) 21 22 @staticmethod >>静态方法(可以通过类调用和对象调用 推荐使用类调用) 可传参 23 def display(): 24 print('666') 25 26 27 obj.display() 28 Foo.display() 29 30 31 32 静态方法:如果方法中无需使用对象中封装的值,则使用静态方法 33 34 总结:1 编写时:方法上方写@staticmethod 方法的参数可有可无 35 2 调用时,直接使用类.方法名() (推荐使用) 也可以使用对象调用 对象》方法名() 36 3 什么时候写静态方法 37 如果方法中无需使用对象中封装的值,则使用静态方法 38 39 40 41 3 类方法 42 class Foo(object): 43 44 @classmethod 类方法 至少有一个参数cls 也可以加参数 45 def show(cls,x1,x2) 46 print(cls,'111') cls 传递的是当前类 cls是类 47 48 Foo.show(1,8) 49 50 结果 :class '__main__'.Foo> 1 8 51 52 53 54 总结:1 类方法定义时:方法上方写:@classmethod 55 方法的参数:至少有一个cls参数 56 2 执行时: 57 类名.方法名() 默认会将当前类传递到参数中 58 3 什么时候用? 59 如果在方法中会使用到当前类就可以使用类方法 60 61 62
属性 :通过方法改造出来的
1 class Foo(object): 2 def __init__(self): 3 pass 4 @property >>属性 5 def start(self): 只能有一个self 后面不能在加参数 6 return 1 7 @property 8 def end(self): 9 return 10 10 obj=Foo() 11 obj.start 不需要加括号 12 obj.end 13 14 15 结果: 1 16 10 17 18 19 编写时:方法上方写@property 20 调用时无需加括号 直接写对象.方法 21 应用场景:对于简单的方法,当无需传参时且有返回值