对象=属性+方法
属性可以理解成变量
方法可以理解成函数
我们用class创建了一个类后,在里面定义变量,函数,但是类不是对象
举个例子
类(class):简单来说就是某一类事物,它们具有相同的属性,例如猫有各种颜色,各种颜色就属于属性(也被叫做变量)。
对象(object):黑猫,白猫这些都是对象,这个对象就是类的实例(instance)
其实
所说所有的变量都是对象。 对象在python里,其实是一个指针,指向一个数据结构,数据结构里有属性,有方法。
对象通常就是指变量。从面向对象的概念来讲,对象是类的一个实例。在python里很简单,对象就是变量。
class A:
myname=“class a”
上面就是一个类。不是对象
a=A()
这里变量a就是一个对象。
它有一个属性(类属性),name,你可以显示出来
print a.name
看到一个变量后面跟点一个小数点,那么小数点后面就是它的属性或者是方法。
带括号的方法。
不带就是属性。
封装
信息隐蔽技术
简单片面理解就是:
,封装就好像是拿来一个麻袋,把猫,狗,王八,老虎一起装进一个袋子,然后把袋子封上口子。照这种逻辑看,封装=‘隐藏’
如何隐藏?
python中用双下划线开头的方式将属性隐藏起来(设置成私有的)
class B:
__n=0
def __fo(self):
print('from A')
def bar(self):
self.__fo() #只有在类内部才可以通过__fo的形式访问到
如果要访问就需要
类的数据属性就应该是共享的,但是语法上是可以把类的数据属性设置成私有的如__n,会变形为_B__n
x=B
x._B__n
其实
python并不会真的阻止你访问私有的属性,模块也遵循这种约定。
python要想与其他编程语言一样,严格控制属性的访问权限,只能借助内置方法如**getattr**
继承
举个栗子:你可以继承你爸的遗产
继承的语法
子类:实现继承的类。
父类(基类、超类):被继承的类。
子类继承父类是在定义子类时,将多个父类放在子类之后的圆括号内,如果定义类时,未指定这个类的直接父类,则默认继承object类,所以object类是所有类的父类(直接父类或者是间接父类)。
class Parent1: # 定义父类
pass
class Parent2: # 定义父类
pass
class Son1(Parent1): # 单继承,基类(父类,超类)是Parent1,派生类(子类)是Son
pass
class Son2(Parent1, Parent2): # 多继承,用逗号分隔开多个继承的类
pass
在python3中,所有的类都会默认继承object类
继承了object类的所有类都是新式类
如果一个类没有继承任何父类,那么__base__就会显示<class ‘object’>
继承的作用:
减少代码的重用
提高代码的可读性
规范编程模式
继承中的派生:
子类在继承父类的属性基础下,也可以重新定义一些属性,如果重新定义的属性(或方法)与父类的相同,则会覆盖父类的属性(或方法),优先执行自己定义的。
class Animal:
def name(self):
print ('我有一只猫,他叫小黄!')
class Myself(Animal): # 重写Animal类的name()方法
def name(self):
print ('我没有猫,我只有一只狗,他叫大白!')
M = Myself() # 创建Myself对象
M.name() # 执行Myself对象的name()方法,打印 我没有猫,我只有一只狗,他叫大白!
super函数调用父类构造方法
class A:
def __init__(self):
self.x = 10
class B(A):
def __init__(self):
super().__init__()
super() 函数是用于调用父类的一个方法。
super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO)、重复调用(钻石继承)等种种问题。
多态:
(以封装和继承为前提)不同的子类调用相同的方法,产生不同的结果
比如说继承中的派生等