1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
class Mori(object):
name = "我是类的公有属性"
# 公有方法,可以在类的内部调用,也可以在类的外部通过实例对象调用
def fun1(self):
print(self.name)
print("我是公有方法")
self.__fun2() # 在类的内部调用私有方法
# 私有方法, 只能在类的内部调用
def fun2(self):
print("我是私有方法“)
# 类方法,可以在类的内部和外部调用,也可以通过类名直接调用
@classmethod
def classFun(self):
print("我是类方法")
# 静态方法,可以在类的内部和外部调用,也可以通过类名直接调用
@staticmethod
def staticFun():
'''注意,这里因为静态方法定义时不需要形参self,因此如果访问类的成员属性,必须通过类名调用(className.varName或className.__varName)
'''
print(Mori.name)
print("我是静态方法")
if __name__ == '__main'__:
myClass = Mori()
myClass.fun1() # 在类的外部通过实例对象调用公有方法
myClass.__fun2() # 不能执行,因为私有方法不能在类的外部调用
Mori,fun1() # 不能执行,因为公有方法不能被类名直接调用
myClass.classFun() # 类方法可以通过实例对象被调用
Mori.classFun() # 类方法也可以通过类名被直接调用
myClass.staticFun() # 静态方法可以通过实例对象被调用
Mori.staticFun() # 静态方法也可以通过类名被直接调用

总结:

  1. 类由成员变量(属性)成员函数(方法)组成。
    1.1 成员变量有:公有属性(也叫类属性)私有属性
    1.2 公有属性(类属性):既可以在类的内部被访问(通过self.varName),也可以在类的外部被访问(通过instance.varName),也可以通过类名被直接访问(通过className.varName)。
    1.3 私有属性: 只能在类的内部被访问(在类中通过self.__varName访问),在类的外部均不能访问(instance.__varNameclassName.__varName都不能访问)。
    1.4 获取或更改私有属性,一般通过在类的内部定义方法来达到获取和更改私有属性的作用。
    1.5 在函数中定义的一般变量是局部变量。

  2. 成员函数有:;公有方法私有方法类方法静态方法
    2.1 公有方法:可以在类的内部被调用,也可以在类的外部通过实例对象调用,但不能通过类名直接调用
    2.2 私有方法:只能在类的内部被调用,在类的外部通过实例对象或类名均不能调用
    2.3 类方法:与公有方法类似,但是可以通过类名被直接调用
    2.4 静态方法:与类方法类似,也可以通过类名被直接调用

  3. 类方法静态方法的区别:
    3.1 定义方法时形参不同。定义类方法时需要self作为形参;但是定义静态方法时不需要self作为形参。(在这环境下,因为静态方法不需要传类实例作为参数,因此在调用成员变量和成员函数时不能通过如self.varNameself.funName这种形式调用,而需要通过类名调用)
    3.2 加载资源的方式不同。类方法是动态加载资源,需要调用某个资源时才加载;而静态方法是运行时一次性加载所有资源(这也是为什么定义静态方法时不需要self作为形参的原因)。(拓展:因此类方法占用内存小而且速度慢,而静态方法占用内存大而且速度快)
    3.3 调用成员属性、成员函数的方式不同。类方法通过self.varName的方式调用成员属性;而静态函数则通过className.varName的形式调用成员属性。