python学习笔记15

python学习笔记15

类的继承

在定义相似的类时,会有很多功能代码重复在使用,类的继承则是为了让重复的功能实现更加简洁。

# 定义一个Animal类
class Animal:
    def __init__(self,name):
        self.name = name
    def eat(self):
        print(f'{self.name} is eating')
    def drink(self):
        print(f'{self.name} is drinking')
# 如果我们想定义一个类,且拥有上述功能,可以如下定义
class Dog(Animal):
    def bark(self):
        print('汪汪汪!')
旺财 = Dog('旺财')
print(旺财.__dict__) # {'name': '旺财'}
旺财.eat() # 旺财 is eating
旺财.drink() # 旺财 is drinking
旺财.bark() # 汪汪汪!
# 可以看到,上面的Dog类不仅可以调用自己内部的方法,还可以调用Animal类的相关方法
# 这里称Animal类为父类、基类或者超类,而Dog类称为子类或者派生类

class Cat(Animal):
    def __init__(self,color):
        self.color = color
小白 = Cat('white')
print(小白.__dict__) # {'color': 'white'}
# 当子类和父类中方法冲突时,以子类中的方法为准

子类可以使用父类中的:方法、静态变量

# 有时子类在调用父类方法的同时还想要执行自己的同名方法
class Animal:
    def __init__(self,name):
        self.name = name
    def eat(self):
        print(f'{self.name} is eating')
    def drink(self):
        print(f'{self.name} is drinking')
class Dog(Animal):
    def __init__(self,name,color):
        Animal.__init__(self,name)
        self.color = color
    def eat(self):
        Animal.eat(self)
        print('汪汪!')
    def bark(self):
        print('汪汪汪!')
旺财 = Dog('旺财','white')
print(旺财.__dict__) # {'name': '旺财', 'color': 'white'}

总的来说,总类的对象在调用方法时,永远先调用自己的:如果自己有则用自己的方法,如果没有就用父类的同名方法;如果自己有方法并且还想用父类的方法,则直接在子类方法中用代码调用父类的方法。

# 观察以下代码,推测其输出
class Fath:
    def __init__(self):
        self.func()
        
    def func(self):
        print('in Fath')
        
        
class Son(Fath):
    def func(self):
        print('in Son')
        
Son() 
# in Son
# 在这里需要了解,在每一个self调用func的时候,不用管这句代码是在哪里执行
# 只看self是什么

多继承

在一些语言(如java)中是不支持多继承的,但是python语言的一个特点就是可以在面向对象中支持多继承。

# 多继承形式如下:
class A:
    def func(self):
        print('in A')
class B:
    def func(self):
        print('in B')
class C(A,B):pass
C().func() # in A
# 在寻找方法时优先寻找定义时在前面的
# 比如上面定义class C(A,B),A在前面则优先找A中的方法
class D(B,A):pass
D().func() # in B

python当中有个object类,它是所有类的祖宗,在python3中所有的类都是继承object类的。python中默认所有定义的类都继承object(即使你定义的类没有声明继承父类)。

# 查看继承的父类,__bases__方法,返回值是元组
class A:pass
class B(object):pass
class C(A,B):pass
class D(C):pass
print(A.__bases__) # (<class 'object'>,)
print(C.__bases__) # (<class '__main__.A'>, <class '__main__.B'>)
print(D.__bases__) # (<class '__main__.C'>,)
# isinstance和type的区别
a = 1
b = 'a'
# 判断是否是某种类型
print(isinstance(a,int)) # True
print(isinstance(a,float)) # False
print(isinstance(b,str)) # True
# 查看变量的类型
print(type(a)) # <class 'int'>
print(type(b)) # <class 'str'>

# 观察以下情况
class Animal:pass
class Dog(Animal):pass
d = Dog()
print(type(d)) # <class '__main__.Dog'>
print(isinstance(d,Dog)) # True
print(isinstance(d,Animal)) # True
print(isinstance(d,object)) # True
# 所以type只能查看对象所属的子类
# 而isinstance可以判断对象所属子类及其父类的关系

绑定方法和普通的函数

from types import FunctionType,MethodType
# FunctionType : 函数
# MethodType : 方法
class A:
    def func(self):
        print('in A')
# 用类调用时,func只是一个函数
print(A.func) # <function A.func at 0x00000140C77ABCA8>
a = A()
# 用实例化对象调用时func是一个绑定方法
print(a.func) # <bound method A.func of <__main__.A object at 0x00000140C77BBE88>>
print(isinstance(A.func,FunctionType)) # True
print(isinstance(A.func,MethodType)) # False
print(isinstance(a.func,FunctionType)) # False
print(isinstance(a.func,MethodType)) # True
# 类的一些方法作用
"""
__doc__ : 查看注释内容
__base__ : 查看父类
__bases__ : 查看所有父类
__dict__ : 查看所有方法
__name__ : 查看名字
__class__ : 查看类型(99.9%是type类型)
__module__ : 查看类所在的模块
"""

经典类和新式类

新式类:只要继承objec类的都是新式类,python3中所有的类都继承自object类,所以python3中所有类都是新式类。

经典类:在python3中不存在,在python2中,不继承object类的类都是经典类。

posted @ 2020-04-01 20:02  卡奇欧  阅读(115)  评论(0)    收藏  举报