python中一切皆对象
class Student: #每个单词首字母大写 类对象 native_space='江苏' # 类属性 def __init__(self,name,age): self.name = name # 局部变量name赋值给实例属性 self.age = age def eat(self): # 实例方法 pass @staticmethod def sm(): # 静态方法,只能用Student.sm()调用 pass @classmethod def cm(cls): # 类方法,只能用Student.cm()调用 pass
类的实例化,实例名=类名()
stu1 = Student('朱嘉骏',20) # 实例对象
只想给某个实例化对象添加某个属性和方法,其他对象不受影响。
stu1.gender='男' # 直接加属性 def show(): print('定义在类之外的函数') stu1.show = show # 直接加类外的方法
提高程序安全性,类是对属性和方法的封装。隔离了复杂度。
在方法或属性前面加两个_,这个属性只能在类内部实用,不希望被其他实例化对象使用(但是可提高dir(stu)查找到该方法并调用)。
如果没有继承类,则默认继承object类。
python支持多继承,
定义子类时候必须在其构造函数调用父类的构造函数
class Person(): # 默认继承object类 def __init__(self, name, age): self.name = name self.age = age def info(self): print('姓名:{0},年龄:{1}'.format(self.name, self.age)) class Student(Person): def __init__(self, name, age, score): super().__init__(name, age)# 调用父类的构造函数 self.score = score
子类要输出自己独有的,父类不能提供,子类要重写方法。
class Student(Person): def __init__(self, name, age, score): super().__init__(name, age)# 调用父类的构造函数 self.score = score def info(self): # 重写子类方法 super().info() # 如果还要用父类的方法 print(self.score)# 自己添改的内容
__str__方法,用于输出对象的描述,直接print(实例对象)默认调用该方法,所以经常对__str__方法重写,用于返回对象的描述
__dir__方法,输出对象的所有属性,内置函数dir()亦可
可拓展性和可维护性
静态语言(java)多态,明确继承关系、方法重写、父类引用指向子类对象
动态语言(python)的多态崇尚鸭子类型
鸭子类型:不关心对象的父类是谁,只关心对象的属性方法。
特殊属性:__dict__实例对象的属性字典,类对象的方法字典;
__class__()对象所属的类,__bases__()父类,__base__()最近的父类,__mro__()类的层次结构,__subclasses__()子类的列表
特殊方法:__add__是+的底层方法,可以通过改写子类的方法来改变该类实例对象的 **+**功能
__len__通过重写方法,让内置函数len()的参数可以是自定义类型
__new__创建对象
__init__对创建的对象初始化##########################课程117,没学完
类的浅拷贝
浅拷贝,python没有特殊说明都是浅拷贝
对象包含的子对象内容不拷贝,因此源对象和拷贝对象引用同一个子对象####没学完
深拷贝
递归拷贝对象中包含的子对象