pytyhon基础——类与对象(1)
点击即可访问(在另一篇文章中)
一、对象
二、面向对象(oop)
三、类的详解
1.类简介:
2.类的创建
3.类的继承
4.类的封装
四、类的继承与重写
1.继承
继承是面向对象三大特性之一
- 通过继承我们可以使用一个类获取到其他类中的属性和方法
- 在定义类时,可以在类名后的括号中指定当前类的父类(超类、基类、super)
- 子类(衍生类)可以直接继承父类中的所有的属性和方法
注意事项:
a.在创建类时,如果省略了父类,则默认父类为object, object是所有类的父类,所有类都继承自object。
b. isinstance()用来检查一个对象是否是一个类的实例
如果这个类是这个对象的父类,也会返回True
所有的对象都是object的实例
2.多重继承
在Python中是支持多重继承的,也就是我们可以为一个类同时指定多个父类
可以在类名的()后边添加多个类,来实现多重继承
多重继承,会使子类同时拥有多个父类,并且会获取到所有父类中的方法
如果多个父类中有同名的方法,则会现在第一个父类中寻找,然后找第二个,然后找第三个。。。前边父类的方法会覆盖后边父类的方法。
注意:
类名.__bases__ 这个属性可以用来获取当前类的所有父类
多重继承示例:
class A(object):
def test(self):
print('AAA')
class B(object):
def test(self):
print('B中的test()方法~~')
def test2(self):
print('BBB')
class C(A,B):
pass
c = C()
c.test()
# 执行结果:AAA
查询流程图
3.重写
在调用流程中我们会发现有先使用本地的方法和属性,我们可以在子类中重写父类中定义过的方法。
在子类中定义的方法,父类中相同方法不调用,即达成重写的目的。
五、类的多态
多态是面向对象的三大特征之一
一个对象可以以不同的形态去呈现
多态 不同的 子类对象 调用相同的 父类方法,产生不同的执行结果
多态优势:
可以 增加代码的灵活度
以 继承 和 重写父类方法 为前提
是调用方法的技巧,不会影响到类的内部设计
链接:
面向对象的三大特征:
封装 - 确保对象中的数据安全
继承 - 保证了对象的可扩展性
多态 - 保证了程序的灵活性
六、特殊方法
↑↑ 点击上方查看特殊方法详解:谷歌浏览器可以直接翻译成中文 ↑↑
特殊方法:也称为魔术方法
特殊方法都是使用__开头和结尾的
特殊方法一般不需要我们手动调用,需要在一些特殊情况下自动执行
# 常用的两个特殊方法对比:
# 定义一个Person类
class Person(object):
"""人类"""
def __init__(self, name , age):
self.name = name
self.age = age
#__str__()这个特殊方法会在尝试将对象转换为字符串的时候调用
# 它的作用可以用来指定对象转换为字符串的结果 (print函数)
def __str__(self):
return 'Person [name=%s , age=%d]'%(self.name,self.age)
# __repr__()这个特殊方法会在对当前对象使用repr()函数时调用
# 它的作用是指定对象在 ‘交互模式’中直接输出的效果
def __repr__(self):
return 'Hello'
object.__add__(self, other)
# object.__sub__(self, other)
# object.__mul__(self, other)
# object.__matmul__(self, other)
# object.__truediv__(self, other)
# object.__floordiv__(self, other)
# object.__mod__(self, other)
# object.__divmod__(self, other)
# object.__pow__(self, other[, modulo])
# object.__lshift__(self, other)
# object.__rshift__(self, other)
# object.__and__(self, other)
# object.__xor__(self, other)
# object.__or__(self, other)
# object.__lt__(self, other) 小于 <
# object.__le__(self, other) 小于等于 <=
# object.__eq__(self, other) 等于 ==
# object.__ne__(self, other) 不等于 !=
# object.__gt__(self, other) 大于 >
# object.__ge__(self, other) 大于等于 >=
七、属性和方法总结
# 定义一个类
class A(object):
#类属性
#实例属性
# 类方法
# 实例方法
# 静态方法
# 类属性,直接在类中定义的属性是类属性
# 类属性可以通过类或类的实例访问到
# 但是类属性只能通过类对象来修改,无法通过实例对象修改
count = 0
def __init__(self):
# 实例属性,通过实例对象添加的属性属于实例属性
# 实例属性只能通过实例对象来访问和修改,类对象无法访问修改
self.name = '嘻嘻哈哈'
# 实例方法
# 在类中定义,以self为第一个参数的方法都是实例方法
# 实例方法在调用时,Python会将调用对象作为self传入
# 实例方法可以通过实例和类去调用
# 当通过实例调用时,会自动将当前调用对象作为self传入
# 当通过类调用时,不会自动传递self,此时我们必须手动传递self
def test(self):
print('这是test方法~~~ ' , self)
# 类方法
# 在类内部使用 @classmethod 来修饰的方法属于类方法
# 类方法的第一个参数是cls,也会被自动传递,cls就是当前的类对象
# 类方法和实例方法的区别,实例方法的第一个参数是self,而类方法的第一个参数是cls
# 类方法可以通过类去调用,也可以通过实例调用,没有区别
@classmethod
def test_2(cls):
print('这是test_2方法,他是一个类方法~~~ ',cls)
print(cls.count)
# 静态方法
# 在类中使用 @staticmethod 来修饰的方法属于静态方法
# 静态方法不需要指定任何的默认参数,静态方法可以通过类和实例去调用
# 静态方法,基本上是一个和当前类无关的方法,它只是一个保存到当前类中的函数
# 静态方法一般都是一些工具方法,和当前类无关
@staticmethod
def test_3():
print('test_3执行了~~~')