面向对象2

一 面向对象的成员

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 应用场景:对于简单的方法,当无需传参时且有返回值
属性
原文地址:https://www.cnblogs.com/mlhz/p/9549941.html