1 类的成员种类
成员公有:里面外面都能用
成员私有:内部使用,外部不能使用,外部想使用可以通过内部人。
1.1 变量
1.1.1 实例变量(字段)
所谓实例变量,先明白什么是实例,实例就是对象,就是类的实例化。因此实例变量就是对象变量。如下列例子:
|
class Foo: 对于对象的理解:类单独建立一个空间,空间里有方法等元素,而对象有单独的空间 |
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 内部调用
|
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() #受贿 |
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 私有:代码内部能使用,子类不能使用 |
应用场景:
如构造方法,如果没有用上,那么就没有意义。一般实例方法使用对象中封装的值
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() |
|
静态方法的特点 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() #报错 外部调用 |
|
# 总结 # 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 |



浙公网安备 33010602011771号