一 面向对象的成员
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.country11 12 13 类变量可以通过对象调用 也可以用类调用14 15 16 准则:实例变量(字段)访问时,使用对象访问:obj1.name17 类变量(静态字段)访问时,用类方法,即: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.__country23 print(Foo.country) #推荐使用类方法访问类变量 >> Foo.__country24 #外部调用25 print(Foo.country) #改为私有后外部不能调用26 27 obj=Foo()28 obj.func()
方法中也有公有和私有之分(成员修饰符)
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 851 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 1010 obj=Foo()11 obj.start 不需要加括号 12 obj.end13 14 15 结果: 116 1017 18 19 编写时:方法上方写@property20 调用时无需加括号 直接写对象.方法21 应用场景:对于简单的方法,当无需传参时且有返回值