一、了解什么是类
1.定义一个简单的类
在Python中,类通过 class 关键字定义,类名通用习惯为首字母大写,Python3中类基本都会继承于object类,语法格式如下,我们创建一个Circle圆类:
class Circle(object):
pass
注意: 我们定义的类都会继承于object类,当然也可以不继承object类;两者区别不大,但没有继承于object类使用多继承时可能会出现问题。
有了Circle类的定义,就可以创建出具体的circle1、circle2等实例,circle1和circle2是个实际的圆。创建实例使用 类名+(),类似函数调用的形式创建。
如下我们创建两个Circle类的实例:
circle1= Circle()
circle2= Circle()
创建好实例对象后,我们就可以使用类中定义的所有方法。
2.self变量
哪个对象调用方法或者属性,self就是那个值
class Human:
def eat(self):
print('人吃饭', id(self))
def sleep(self):
print('人要睡觉', id(self))
if __name__ == '__main__':
zs = Human()
zs.eat()
zs.sleep()
print(id(zs))
ls = Human()
ls.eat()
ls.sleep()
print(id(ls))
3.类属性和实例属性
class People:
father = '张三'
def fun(self, mother):
return '爸爸是{},妈妈是{}'.format(self.father, mother)
if __name__ == '__main__':
people = People()
print(people.fun('丽丽'))
print(id(people.father))
print(id(People.father))
people.father = '李四'
People.father = '王五'
print(people.father)
print(People.father)
二、面向对象的三大特征
1.封装
- 定义: 封装是将类中的某些方法或者属性隐藏,对象不能直接使用隐藏的方法或者属性,具有保护功能
- 格式: __属性(方法),使用双下划线
- 目的: 保护隐私
- 如何调用: 只有在本类的内部可以使用,外部不可以修改和使用
举例:
class Girl:
name = '张三'
__age = 15
def show(self):
print(self.name, self.__age)
if __name__ == '__main__':
g = Girl()
g.show()
我们输出age
print(g.age)
print(g.__age)
因为是私有属性,外部不可直接使用
g = Girl()
g.__age = '20'
print(g.__age)
这样使用并不是修改类中的__age ,而是重新创建了一个__age 的属性
另外我们可以使用实例对象.__dict__ 方法查看所有a属性的元素
print(g.__dict__)#---{'name': '张三', '_Girl__age': 10, '__age': 15}
但是如果非想改,可以使用实例对象._类名__属性名 修改,但是不建议使用
比如修改:
g = Girl()
g._Girl__age = 30
g.show()
2.继承
- 定义: 子类需要使用父类的属性和方法,但是子类中也可以定义自己的属性和方法。
- 概念: 被继承的类叫父类/基类/超类,继承的类叫子类/派生类
2.1 单继承
class Animal:
def __init__(self, name, age):
self.name = name
self.age = age
def eat(self):
print('吃')
def sleep(self):
print('睡')
class Cat(Animal):
def jiao(self):
print('喵')
class Dog(Animal):
def jiao(self):
print('汪')
if __name__ == '__main__':
c = Cat('猫', 10)
d = Dog('狗', 12)
c.eat()
d.eat()
查看父类的方法__bases__
print(Cat.__bases__)#(<class '__main__.Animal'>,)
print(Animal.__bases__)#(<class 'object'>,),object是所有类的组宗,这种类叫新式类
2.2 方法重写
当子类要使用的方法在父类中已经定义,但是和自己想用的方法有出入,那么就可以对父类的方法进行重写
class A():
def hehe(self):
print('呵呵')
class B(A):
def hehe(self):
print('哈哈')
if __name__ == '__main__':
a=A()
b=B()
a.hehe()
b.hehe()
2.3 super方法
子类和父类有相同的方法,如果子类下个调用父类相同的方法可以使用super
class Animal():
def __init__(self,name):
self.name=name
class Cat(Animal):
def __init__(self,name,speed):
self.speed=speed
super().__init__(name)
def jiao(self):
print(self.name,self.speed)
if __name__ == '__main__':
c=Cat('波斯猫',3500)
c.jiao()
2.4 多继承
多继承如果父类们拥有共同的方法则按照第一个顺序进行继承
class A:
def shuchu(self):
print('A')
class B():
def shuchu(self):
print('B')
class C(A, B):
def shuchu3(self):
print('C')
if __name__ == '__main__':
c = C()
c.shuchu()
2.5 多继承的本质
提示:mro方法可以根据广度优先算法,得出继承顺序,一步一步执行
class A():
def func(self):
print('A开始')
print('A结束')
class B(A):
def func(self):
print('B开始')
super().func()
print('B结束')
class C(A):
def func(self):
print('C开始')
super().func()
print('C结束')
class D(B,C):
def func(self):
print('D开始')
super().func()
print('D结束')
d=D()
d.func()
class A:
def __init__(self):
print('A开始')
print('A结束')
class B(A):
def __init__(self):
print('B开始')
super().__init__()
print('B结束')
class C(A):
def __init__(self):
print('C开始')
super().__init__()
print('C结束')
class D(B,C):
def __init__(self):
print('D开始')
super().__init__()
print('D结束')
print(D.mro())
此类题不用init方法,用别的方法也是一样
2.6 关于继承的一些注意事项
- 子类继承父类,如果子类不重写父类的某个方法,那么子类执行父类的方法
- 子类继承父类,如果子类复写了某个方法,那么子类只使用自己的方法
- 父类的私有属性不能被继承
3.多态
python是弱类型语言,python中处处是多态;python中没有多态,但是有鸭子类型 ()一些类含有相同的方法,则这些类就互称为鸭子
class Alipay():
def pay(self):
print('支付宝支付')
class Wechatpay():
def pay(self):
print('微信支付')
class Person():
def xiaofei(self, a):
a.pay()
if __name__ == '__main__':
ali = Alipay()
wx = Wechatpay()
p = Person()
p.xiaofei(wx)
p.xiaofei(ali)
|