继承
- 面向对象的编程有三大特性
- 封装:
- 函数是对语句的封装
- 类是对函数和变量的封装
- 继承
- 类和类之间可以人为,手动的建立父子关系
- 父类的属性和方法,子类可以使用
- 多态
- 是一种技巧
- 可以提供代码的灵活度
- 封装:
继承的使用
class Animals(object):
def __init__(self,name,age) -> None:
self.name = name
self.age = age
def sleep(self):
print('{}正在睡觉'.format(self.name))
class Dog(Animals):
def bark(self):
print('{}正在叫'.format(self.name))
# Dog() 调用 __new__ 方法,再调用 __init__ 方法
# Dog 中没有 __new__ 方法,会查看父类是否重写了 __new__ 方法
# 父类中也没有重写 __new__ 方法,会查找父类的父类,查找到 object
# 调用 __init__ 方法,Dog类没有实现,会自动查找 Animal 父类
d1 = Dog('大黄',3)
print(d1.name) # 父类中定义的属性,子类可以直接调用
d1.bark() # 子类中自己定义的方法,自己使用
d1.sleep() # 父类中定义的方法,实例对象可以直接调用
继承的注意事项
- 在定义类时,如果不写父类,在Pyhton3中,默认继承自object,如下:
class C:
- 继承可以传递,如B继承自A,C继承自B,那么A类中的各类属性和方法,C类中也可用
- 在Python中,允许多继承,如下:
class C(A,B):
- 如果有两个不同的父类中,有同名的不同方法;A类中有foo方法,B类中也有foo方法(深度优先)
- 有一个类对象的属性可以查看方法的调用顺序
__mro__
- 依次查找,全都没有则报错
私有属性的集成特点
- 类中自己定义的私有方法,可以通过
对象名._类名__私有方法名()
方法进行调用 - 父类的私有方法,子类不会继承
- 父类的私有属性,子类不会继承
新式类和经典类
# 手动的指定 Studen 类继承自 object
class Student(object):
pass
# 没有指定 Dog 的父类,Python3中默认继承自 object
class Dog:
pass
- 新式类和经典类的概念:
-
- 新式类:继承自 object 的类我们称之为新式类
-
- 经典类:不继承自 object 的类
- 在Python2中,如果不手动指定的一个类的父类是object,这个类就是一个经典类
- 在Python3中,不存在经典类,都是新式类
Python2和Python3的区别
-
八进制数据的表示方式
- Python2里,0o开始的数字是八进制,以 0 开始的数字也是八进制
- 032 ==> 八进制的32
- 0o32 ==> 八进制的32
- 079 ==> 十进制的79
- Python3里,八进制只能使用 0o开头
- Python2里,0o开始的数字是八进制,以 0 开始的数字也是八进制
-
除法运算符的区别
- python2里两个整数相除得到的结果是一个整数。 10 / 3 ==> 3
- python3里两个整数相除的结果是一个浮点数。 10 / 3 = 3.3333333
-
比较运算符的区别
- Python2里可以使用!=和 <> 来表示不等于运算符
- python3里不再支持 <>,只能使用 != 表示不等运算符
-
字符串的表示方式
- Python2里可以使用反引号``来表示字符串
- Python3里不再支持反引号 ``
-
print语句的区别
- Python2里支持 print 'hello' 这种写法
- Python3里支持 print('hello')
-
input语句的区别
- Python2里的input,会把用户的输入当做代码,根据用户输入的内容来确定类型;raw_input和Python3里的input功能一致
- Python3直接接受用户的输入,所有的数据都是字符串类型,Python3里的input相当于Python2里的raw_input;Python3里不再支持raw_input了
-
中文的支持
- Python2默认不支持中文,需要在代码的最前面写注释,让它支持中文
-*-coding:utf8-*-
- Python3默认支持中文
- Python2默认不支持中文,需要在代码的最前面写注释,让它支持中文
-
新式类和经典类
- 经典类:不继承自object的类,称之为经典类
- 新式类:继承自object的类
- Python3不再支持经典类,都是新式类,一个类如果不指定父类,默认都继承自object
面向对象的方法
is
身份运算符是用来比较是否是同一个对象type
type方法,获取的是类对象isinstance
用来判断一个对象是否是由指定的类(或者父类)实例创建出来的issubclass
用来判断一个类是否是另一个类的子类- 代码示例如下:
class Person(object):
def __init__(self, name, age):
self.name = name
self.age = age
class X(object):
pass
class Student(Person, X):
pass
p1 = Person('张三', 18)
p2 = Person('张三', 18)
s = Student('jack', 20)
# 获取两个对象的内存地址 id(p1) == id(p2)
print(p1 is p2) # is 身份运算符运算符是用来比较是否是同一个对象
# type(p1) # 其实获取的就是类对象
print(type(p1) == Person)
# s这个实例对象是否是由Student类创建的?
print(type(s) == Student)
print(type(s) == Person) # False
# isinstance 用来判断一个对象是否是由指定的类(或者父类)实例化出来的
print(isinstance(s, (Student, X))) # True
print(isinstance(s, Person)) # True
print(isinstance(p1, Person)) # True
print(isinstance(p1, Student)) # False
# issubclass 用来判断一个类是否是另一个类的子类
print(issubclass(Student, (Person, X))) # True
print(issubclass(Person, Student)) # False
多态
子类重写父类方法
- 继承特点:
- 如果一个类A,继承自类B,由A创建出来的实例对象都可以使用类B中的方法
-
- 子类的实现和父类的实现完全不一样,子类可以选择重写父类的方法
-
- 在父类的基础上,又有更多的实现
- 调用父类的方法的两种方式
- 使用
父类名.__方法名__(self,参数)
调用父类的方法 - 使用
super().__init__(参数列表)
直接调用父类的方法 - 推荐使用super方式
- 使用
- 演示代码如下:
class Person(object):
def __init__(self,name,age) -> None:
self.name = name
self.age = age
def sleep(self):
print(self.name + '正在睡觉')
class Students(Person):
def __init__(self, name, age,school) -> None:
# Person.__init__(self,name,age) # 使用父类名.__方法名__(self,参数) 调用父类的方法
super().__init__(name, age) # 使用super直接调用父类的方法
self.school = school
def sleep(self):
print(self.name + '正在课间休息') # 此处重写父类的sleep方法
def study(self):
print(self.name + '正在学习')
s = Students('jerry',20) # 调用了父类的 __init__ 方法
s.sleep() # 重写后,输出 ==> jerry正在课间休息
多态的使用
- 多态是基于继承的,通过子类重写父类的方法
- 达到不通的子类对象调用相同的父类方法,得到不同的结果
- 提高代码的灵活度
class Dog(object):
def work(self):
print('狗正在工作')
class KeJi(Dog):
def work(self):
print('柯基犬正在工作')
class SaMo(Dog):
def work(self):
print('萨摩犬正在工作')
class XiShi(Dog):
def work(self):
print('西施犬正在工作')
class Person(object):
def __init__(self,name) -> None:
self.name = name
self.dog = None
def work_with_dog(self): # 此处不需要针对每种不同类型的狗,定义不同的work_with_dog方法
if self.dog is not None and isinstance(self.dog,Dog):
self.dog.work()
p = Person('张三')
xs = XiShi()
p.dog = xs
p.work_with_dog()
标签:__,name,Python,self,object,多态,面向对象编程,print,父类
From: https://www.cnblogs.com/Lz-heng/p/16595186.html