OOP的设计:
2、类变量:存在类的 __dict__ 里面
-
建议在一个模块里编写类,另一个模块去实例化这个类进行调用
-
设计类的时候,一定要抓住 “行为” 和 “特征”
-
大多数方法/函数都是为了进行变量处理而存在的
1、实例变量:存在实例的 __dict__ 里面
实例方法中定义的变量,self.params_name
class Student(object):
def __init__(self, name, age, sex): # 构造方法
self.name = name # 实例变量,通过self. 进行调用并赋值
self.age = age
sex = sex # 这个不是实例变量,只是当前方法的局部变量,如果不被其他实例方法调用,可以考虑这么定义
定义在类中的变量,一般与实例无关,才设计成类变量
class Student(object):
s_sum = 0 # 类变量,OOP设计的时候,跟实例无关的变量可以当作类变量
3、实例方法:
定义在类中的方法,可以理解为处理实例变量的方法,约定俗成形参为 self
class Student(object):
def __init__(self, name, age, sex): # 构造方法
self.name = name # 实例变量,通过self. 进行调用并赋值
self.age = age
sex = sex # 这个不是实例变量,只是当前方法的局部变量,如果不被其他实例方法调用,可以考虑这么定义
def do_homework(self):
print('我是个实例方法,我传入self参数,这个self只是约定俗成的,你可以定义为其他名字,但是不建议这么做')
print(self.__class__.s_sum)
4、类方法:
用于处理类变量的方法,加了@classmethod装饰器,约定俗成形参为 cls;如果不加此装饰器,就算形参是 cls 也不是类方法
class Student(object):
s_sum = 0 # 类变量,OOP设计的时候,跟实例无关的变量可以当作类变量
@classmethod
def do_s_sum(cls):
print("我是个类方法,顾名思义,我是类变量的加工器,我传入一个cls参数,"
"这个名字也是约定俗成的,你也可以定义为其他的,但并不建议这么做")
cls.s_sum += 1
print("Now student's number is: ".format(cls.s_sum))
5、静态方法:
加了@staticmethod装饰器的方法,无默认形参,与类和实例无关的时候,将此方法定义为静态方法,由于静态方法和类方法可以达到相同的效果,一般不建议使用静态方法
class Student(object):
@staticmethod
def other_method(x, y):
print("我跟类和实例没有关系,我更类似于一个全局方法,只不过放在类里显得更OO")
6、访问类变量的两种方法:
6.1、实例中访问类变量(不推荐)
class Student(object):
s_sum = 0 # 类变量,OOP设计的时候,跟实例无关的变量可以当作类变量
def do_homework(self):
print('我是个实例方法,我传入self参数,这个self只是约定俗成的,你可以定义为其他名字,但是不建议这么做')
print(self.__class__.s_sum) # 实例中访问类变量
6.2、类方法中访问与操作类变量(推荐)
class Student(object):
s_sum = 0 # 类变量,OOP设计的时候,跟实例无关的变量可以当作类变量
@classmethod
def do_s_sum(cls):
print("我是个类方法,顾名思义,我是类变量的加工器,我传入一个cls参数,"
"这个名字也是约定俗成的,你也可以定义为其他的,但并不建议这么做")
cls.s_sum += 1 # 类方法中操作类变量,这样更符合规范
print("Now student's number is: ".format(cls.s_sum))
最后感谢慕课网七月老师,他讲解的《Python3 入门与进阶》视频课程中 OOP这一块的内容是我听过讲解相当透彻的。
感谢大神。