Python面向对象学习笔记
① 类名 AaaBbb (多个单词首字母大写) ps: 普通变量名小写,多个单词间用下划线连接
② 类的实例化: 变量名=类名() ps:没有关键字 new
③ 调用类下的方法 : 变量名.方法名() 调用类下的属性:变量名.属性名
ps: 1> 方法和函数有区别~ 但现在好像不区分了~ 2>在类下编写的函数与在模块中编写的函数有区别,前者参数列表中强制需要一个 self
④ 代码示例
ps:不建议一个模块下,既定义了类,又实例化。建议类单独放在一个模块
⑤clss常见误区1:在类中调用函数 × ps:类只负责刻画、描述,不负责执行代码
⑥ 在第二个模块B.py 中调用第一个模块A.py(类Student)中的方法: from A import Student 导入类,然后实例化并调用
⑦ 方法和函数的区别:现在区别比较模糊--- 在C、C++中常称 函数,在Java,C#中常称 方法 ; 方法:侧重在设计层面;函数:程序运行,过程中的称谓
⑧ 类下有:数据成员(特征)+方法(行为) 类:共性(模板);实例:个性;
⑨ 实例化的时候,会自动调用构造函数( def __init__(self): 下的内容) 当然 __init__函数也可以被调用
⑩ 构造函数(__init__),不能返回除了None之外的东西~ return None √ (默认值) return ‘123’ ×
⑩① 构造函数作用:让模板生成不同对象,__init__可以传入参数 def __init__(self,参数1,参数2...): 此时在实例化的时候必须传入对应的参数
初始化对象的特征/属性 name(类下的属性) = name(传入的参数) ps:但此时用实例名.属性 不会获得传入的值
⑩② 类变量:和类相关联的变量
实例变量:和对象相关联的 (对象由类实例化产生的) 正确的实例变量赋值方式:self.name=name
实例变量---传入类中---修改类变量( __init__下:self.name=name) ---可通过实例名.属性 获得
⑩③ self与类无关,只和对象有关 self代表对象/实例
⑩④ 实例方法:与对象/实例相关联,实例可以调用
⑩⑤ 在实例方法中访问/修改类变量 a:实例方法下 使用 实例名.类变量名 b: 实例方法下 使用 self.__class__.类变量名
⑩⑥ 类方法 @classmethod (@装饰器) def add_num(cls): pass ps:这里建议用cls,而不是常用的self (但是用别的名也可以~)
⑩⑦ 在类方法下 访问/修改 类变量 cls.num+=num 可直接修改
⑩⑧ 类方法调用: 类名.类方法名
⑩⑨ 类方法与实例方法的区别:类方法关联类;实例方法关联实例
②① 对象调用类的方法?可以 建议不要用~ 在逻辑上是说不通的~
②② 静态方法:@staticmethod def add(x,y):pass 静态方法可以同时被类和对象调用 静态方法内部也可以访问类变量: 类名.类变量名 静态方法不不能访问实例变量
②③ 静态方法:能用静态方法的都可以用类方法代替,类方法更方便~ 建议不用静态方法,与面向对象关系不大~
②④ 类方法,静态方法 代码示例
②⑤ 通过方法修改数据变量比直接修改数据变量安全---方法可以修改的同时进行判断
②⑥ 成员可见性 : 其他OOP语言:公开的 public (可读取,可赋值) 私有的 private
1> 若 变量/方法 名前有__(双下划线) 例如: def __marking(self,score): python 认为是 私有的;
若没有 __,默认是公开的 (特殊 __init__ 这种命名方式,不是私有~ 前后都有下划线,是python内置函数的风格~)
2> student1.__socre=-1 python的动态语言的特性,能给 student1 添加新的属性 __score
3> 可用 __dict__ 内置函数查看一下(student1.__dict__): 原私有变量 的 存储 _Student__score (python自动更改~) ,新加的变量 __score ps:所以python对私有变量的保护很简单:只是在把k,v存到dict时名字k 改了。。。
②⑦ 面向对象三大特性:封装,继承,多态
②⑧ 继承性:(python可以多继承)
单继承:1>举个例子,并不规范:
2>规范的:
将 Human.__init__(self,name,age) 替换成 super(Student,self).__init__(name,age)
②⑨ super 也可用于普通的实例方法里