【python学习11】类和对象的再次深入

                      *7、类的赋值、浅拷贝、深拷贝 

(一)封装 

 

 

self.__age=age:  self.__age前面有两个"_",说明该属性不能在类对象外部被访问 

(二)继承

子类中的初始化方法中有 super().__init__(name,age)  是调用父类的初始化方法给属性赋值,scorestudent  类中自己的属性,使用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

(七)类的赋值、浅拷贝、深拷贝

浅拷贝:子对象是指 该源对象中包括的其他类的实例对象,源对象和拷贝对象引用同一个

              子对象

深拷贝:会拷贝对象中包含的子对象,源对象和拷贝对象的所有子对象不相同

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值