*7、类的赋值、浅拷贝、深拷贝
(一)封装
self.__age=age: self.__age前面有两个"_",说明该属性不能在类对象外部被访问
(二)继承
子类中的初始化方法中有 super().__init__(name,age) 是调用父类的初始化方法给属性赋值,score 是 student 类中自己的属性,使用self进行赋值
class Person:
def __init__(self,name,age):
self.name=name
self.age=age
def info(self):
print(self.name,self.age)
#定义子类
class Student(Person):
def __init__(self,name,age,score):
super().__init__(name,age) #调用父类的初始化方法给name,age赋值
self.score=score #score是该类中自己的属性,故用self赋值
class Teacher(Person):
def __init__(self,name,age,teacheryear):
super().__init__(name,age) #调用父类的初始化方法给name,age赋值
self.teacheryear=teacheryear #teacheryear是该类中自己的属性,故用self赋值
stu=Student("张三",18,95)
teacher=Teacher("王梅",32,8)
stu.info()
teacher.info()
python 中也可以实现 多继承
class A(object):
pass
class B(object):
pass
class C(A,B): #C类同时继承了A类,B类
pass
(三)方法重写
方法重写:①可在子类中对方法重新编写
②子类中重写后的方法可用 super().xx() 调用父类中原始的方法 (和子类中的初始化方法一样用super().__init__(name,age)语句调用父类中的初始化方法)
③重写方法时会出现箭头显示overrides method in object
class Person: #父类
def __init__(self,name,age):
self.name=name
self.age=age
def info(self):
print(self.name,self.age)
#定义子类
class Student(Person):
def __init__(self,name,age,score):
super().__init__(name,age) #调用父类的初始化方法给name,age赋值
self.score=score #score是该类中自己的属性,故用self赋值
def info(self):
super().info() #重写子类中的info方法,若还想用父类的方法要写super().info()
print(self.score) #重写方法后添加的语句
class Teacher(Person):
def __init__(self,name,age,teacheryear):
super().__init__(name,age) #调用父类的初始化方法给name,age赋值
self.teacheryear=teacheryear #teacheryear是该类中自己的属性,故用self赋值
stu=Student("张三",18,95)
teacher=Teacher("王梅",32,8)
stu.info()
teacher.info()
(四)object类
__str__()方法没搞懂
写完类之后,通常对 __str__()方法进行重写
class Student: #若未见说明则继承object类
pass
stu=Student()
print(dir(stu)) #内置函数dir()查看指定对象所有属性
(五)多态的实现
class Animal(object):
def eat(self):
print("动物会吃")
class Dog(Animal):
def eat(self):
print("狗吃骨头")
class Cat(Animal):
def eat(self):
print("猫吃鱼")
class Person(object):
def eat(self):
print("人吃任何")
def fun(obj):
obj.eat()
fun(Cat())
fun(Dog())
fun(Animal())
fun(Person()) #不用关心Person时谁的子类,只关心Person是否具有eat方法
不用关心上面代码中 Person 是谁的子类,只关心Person是否具有eat方法
JAVA是静态语言,Python是动态语言
(六)特殊属性和特殊方法
以两个下划线"__"开始和两个下划线"__"结束的属性或方法,是特殊的属性或方法
1,特殊属性
类对象的__dict__属性包括该类的所有属性和方法的字典,实例对象的__dict__属性包括该实例对象的所有属性的字典
print(x.__class__) #属性__class__,输出实例对象x所属的类
print(C.__bases__) #属性__bases__,输出C类所继承的多个父类并将父类放在元组中
print(C.__mro__) #属性__mro__,输出可查看类的层次结构,即子类父类和祖父类
print(A.__subclasses__) #属性__subclasses__,查看A类的子类并把子类放在列表中
2,特殊方法
若想让两个实例对象的某些属性相加,则需要在类中重写__add__()方法(理解表中对应内容)
若想统计实例对象某些属性的长度,则需要在类中重写__len__()方法(理解表中对应内容)
(1)__new__与__init__演示创建对象的过程
①方框中的9360,7104是输出的地址;箭头表示传参的过程
②由上图可知先用__new__创建对象,再用__init__初始化对象
③上图__new__方法中用了super().__new__(cls),使用父类object类中的创建对象的方法传参cls
(七)类的赋值、浅拷贝、深拷贝
浅拷贝:子对象是指 该源对象中包括的其他类的实例对象,源对象和拷贝对象引用同一个
子对象
深拷贝:会拷贝对象中包含的子对象,源对象和拷贝对象的所有子对象不相同