诚意
诚意如你,当一诚的态度对待

导航

 

1     类的成员种类

成员公有:里面外面都能用

成员私有:内部使用,外部不能使用,外部想使用可以通过内部人。

1.1   变量

1.1.1 实例变量字段

所谓实例变量,先明白什么是实例,实例就是对象,就是类的实例化。因此实例变量就是对象变量。如下列例子:

class Foo:
    def __init__(self,name):
        self.name=name      #实例变量/字段
   
def func(self):
        pass
obj = Foo('li')   

 

对于对象的理解:类单独建立一个空间,空间里有方法等元素,而对象有单独的空间

 

1.1.1.1  公有/私有实例变量

 1 #################公有变量########
 2 class Foo:
 3     def __init__(self,name):
 4         self.name=name      #实例变量/字段
 5     def func(self):
 6         print(self.name)
 7 obj = Foo('li')
 8 print(obj.name)         #li外部调用
 9 obj.func()              #li内部调用
10 ##############私有变量##########
11 class Foo:
12     def __init__(self,name):
13         self._name=name      #实例变量/字段
14     def func(self):
15         print(self._name)
16 obj = Foo('li')
17 print(obj.name)  # 报错  外部调用
18 obj.func()  # li 内部调用


python中

“单下划线” 开始的成员变量叫做保护变量,意思是只有类对象和子类对象自己能访问到这些变量;
”双下划线” 开始的是私有成员,意思是只有类对象自己能访问,连子类对象也不能访问到这个数据。

python中的命名方法:
1. object # 公用方法
2. __object__ # 内建方法,用户不要这样定义
3. __object # 全私有,全保护
4. _object # 半保护

 

1.1.2 类变量(静态字段)

首先要明白什么是类变量?类变量就是在类中定义的变量

1.1.2.1  公有/私有类变量如何使用

 1 ##############公有类变量###############
 2 class Foo:
 3     country = '中国'          #类变量(静态字段)
 4     def __init__(self,name):
 5         self.name = name        #实例变量(字段)
 6     def func(self):
 7         pass
 8 obj1 = Foo('li')
 9 obj1.country = '天地'
10 print(obj1.country)     #天地     #类变量的对象调用
11 print(Foo.country)      #中国      #类变量的类调用
12 Foo.country = '美国'          #类变量的修改方式
13 print(Foo.country)      #美国
14 ##############私有类变量###############
15 class Foo:
16     __country = '中国'          #类变量(静态字段)
17     def __init__(self,name):
18         self.name = name        #实例变量(字段)
19     def func(self): #内部调用
20         print(self.__country)   #对象调用内部
21         print(Foo.__country)    #类调用内部
22 obj1 = Foo('li')
23 obj1.func()
24 print(Foo.__country)    #外部无法调用

1.1.2.2  类变量的应用场景

当所有对象中有共同的字段时且要改都改要删都删时,可以将 实例变量(字段) 提取到 类变量(静态字段)

 

准则:

#   实例变量(字段)访问时,使用对象访问,即: obj1.name

#   类变量(静态字段)访问时,使用类方法,即: Foo.country  (实在不方便时,才使用对象)

1.1.2.3  思考题

如何验证子类不知道父类的私有变量的存在?那么如果确定不知道,又该如何获取父类的私有变量?(以儿子想得知父亲的受贿情况为例)

 1 # 无法访问:
 2 class Base(object):
 3     __secret = "受贿"
 4 
 5 class Foo(Base):
 6     def func(self):
 7         print(self.__secret)
 8         print(Foo.__secret)
 9 
10 obj = Foo()
11 obj.func()      #报错
12 
13 
14 
15 # 可以访问:儿子可以通过观察老子的行为,1000的工资开兰博基尼肯定有问题
16 class Base(object):
17     __secret = "受贿"
18 
19     def zt(self):
20         print(Base.__secret)
21 
22 class Foo(Base):
23 
24     def func(self):
25         print(self.__secret)
26         print(Foo.__secret)
27 
28 
29 obj = Foo()     
30 obj.zt()        #受贿
View Code

 

1.2   方法

1.2.1 公有/私有(成员修饰符) 实例方法

 

 1 class Foo(object):
 2 
 3     def __init__(self,name):         #实例方法(构造方法)
 4 
 5         self.name = name
 6 
 7     def func(self):                #实例方法
 8 
 9         print('123')
10 
11  
12 
13 obj = Foo('史雷')
14 
15 obj.func()
16 
17  
18 
19 ######### 私有的实例方法 #######
20 
21 class Foo(object):
22 
23     def __init__(self):
24 
25         pass
26 
27     def __display(self,arg):
28 
29         print('私有方法',arg)
30 
31     def func(self):
32 
33         self.__display(123)
34 
35  
36 
37 obj = Foo()
38 
39 # obj.__display(123) # 无法访问
40 
41 obj.func()
42 公有:外部内部都能使用
43 
44 私有:代码内部能使用,子类不能使用
View Code

应用场景

如构造方法,如果没有用上,那么就没有意义。一般实例方法使用对象中封装的值

1.2.2 公有/私有 静态方法

 1 class Foo:
 2     def __init__(self,name):
 3         self.name = name
 4 
 5     # 实例方法
 6     def func(self):
 7         print(self.name)
 8 
 9     # 静态方法,如果方法无需使用对象中封装的值,那么就可以使用静态方法
10     @staticmethod
11     def display(a1,a2):
12         return a1+a2
13 
14 
15 obj = Foo('li')
16 obj.func()
17 ret = Foo.display(1,3)
18 print(ret)
19 
20  
21 
22 ######### 私有的静态方法 #########
23 
24 class Foo(object):
25 
26     def __init__(self):
27 
28         pass
29 
30     @staticmethod
31 
32     def __display(arg):
33 
34         print('私有静态 方法',arg)
35 
36     def func(self):
37 
38         Foo.__display(123)
39 
40     @staticmethod
41 
42     def get_display():
43 
44         Foo.__display(888)
45 
46  
47 
48 # Foo.__display(123) 报错
49 
50  
51 
52 obj = Foo()
53 
54 obj.func()
55 
56  
57 
58 Foo.get_display()
View Code

 

静态方法的特点

1. 编写时:

#        - 方法上方写 @staticmethod

#        - 方法参数可有可无

#   2. 调用时:

#       - 类.方法名()  *

#       - 对象.方法名()

#   3. 什么时写静态方法?

#       - 无需调用对象中已封装的值.

 

1.2.3 公有/私有 类方法(与静态方法类似)

 1 class Foo:
 2     def __init__(self,name):
 3         self.name = name
 4 
 5     # 实例方法,self是对象
 6     def func(self):
 7         print(self.name)
 8 
 9     # 静态方法,如果方法无需使用对象中封装的值,那么就可以使用静态方法
10     @staticmethod
11     def display(a1,a2):
12         return a1+a2
13 
14     # 类方法,cls是类
15     @classmethod
16     def show(cls,x1,x2):
17         print(cls,x1,x2)
18         
19 Foo.show(1,8)   #<class '__main__.Foo'> 1 8   # # 执行类方法
20 
21  
22 
23  
24 
25 ######### 私有的类方法 #########
26 
27  
28 
29 class Foo:
30     def __init__(self,name):
31         self.name = name
32     # 类方法,cls是类
33     @classmethod
34     def show(cls):
35         Foo.__show()   #内部调用
36 
37     @classmethod
38     def __show(cls):
39         print(cls)
40 
41 Foo.show()   #<class '__main__.Foo'>
42 
43 Foo.__show() #报错  外部调用
View Code

 

# 总结

#   1. 定义时:

#        - 方法上方写: @classmethod

#        - 方法的参数: 至少有一个cls参数

#   2. 执行时:

#        - 类名.方法名()  # 默认会将当前类传到参数中.

#   3. 什么时用?

#        - 如果在方法中会使用到当前类,那么就可以使用类方法.

 

1.2.4 静态方法/类方法和实例方法的区别?

(1):定义上

              实例:

                     方法的参数: 至少有一个self参数

              静态:

                     - 方法上方写 @staticmethod

                     - 方法参数可有可无

              类:

                     - 方法上方写: @classmethod

                     - 方法的参数: 至少有一个cls参数

 

(2): 执行上

              实例:

                     需调用对象中已封装的值.

              静态:

                     无需调用对象中已封装的值.

              类:

                     - 类名.方法名()  # 默认会将当前类传到参数中.

 

(3):应用场景上

              实例:

                     - 对象.方法名()

              静态:

                     - 类.方法名()  *

                     - 对象.方法名()

              类:

                     - 如果在方法中会使用到当前类,那么就可以使用类方法.

1.3   公有/私有 属性(通过方法改造来的)

 

如果你已经了解Python类中的方法,那么属性就非常简单了,因为Python中的属性其实是普通方法的变种。

 

对于属性,有以下三个知识点:

 

  • 属性的基本使用
  • 属性的两种定义方式

属性的基本使用

# ############### 定义 ###############
class Foo:

    def func(self):
        pass

    # 定义属性
    @property
    def prop(self):
        pass
# ############### 调用 ###############
foo_obj = Foo()

foo_obj.func()
foo_obj.prop   #调用属性

 

 

 

# 总结:

#     1. 编写时

#            - 方法上方写 @property

#            - 方法参数:只有一个self

#     2. 调用时:无需加括号  对象.方法

#     3. 应用场景: 对于简单的方法,当无需传参且有返回值时,可以使用 @property

 

 

 

posted on 2018-08-28 19:22  诚意  阅读(244)  评论(0)    收藏  举报