python面向对象笔记(what)
1.什么是面向对象?
对象相当于把函数和全局变量封装起来,属相相当于全局变量,方法相当于函数。
不同对象相互隔离,全局变量互不影响。
2.什么是隐藏属性?
在方法中设置属性,即给对象赋值,那比如我要对一个变量进行判断,效果会更好。打个比方,我创建了一个对象dog,给dog一个年龄属性,那我通过方法中去定义dog的属性的话,我可以添加条件,如果输入的dog的年龄小于0,那么我返回错误。这比直接给属性赋值效果会更好。
3.什么是私有方法?
如果程序中有私有方法,那私有方法一定是很重要的。私有方法,从字面上理解那肯定是私有的,那必然是不允许随便调用的,需要加上一些条件才允许调用。
私有方法的格式是这样的:
__send_msg()
公有方法格式
send_msg()
这里举一个例子,发短信的例子,即我要满足一个特定的条件以后,我才调用私有的方法,这个方法实现的功能发送短信;那如果不满足,我就调用公有的方法,实现的功能是提示余额不足,请充值。
class Message: def __send_msg(self,balance): print("正在发送短信") def send_msg(self,balance): if balanc>=100: self.__send_msg() else: print("余额不足,请充值!")
4.什么是 del方法
当程序执行完毕,或者删除对象的时候(引用计数为0时)会自动调用del方法,释放内存,这就相当于英雄over,瞬间爆炸。
5.测量对象的引用个数
class test: def func(self):t = test()tt = timport syssys.getrefcount(t)实际引用计数=得到的引用计数-1
6.什么是继承?
python中的继承类似于物种的继承概念。比如猫狗继承了动物的一些特征,那python中的继承的功能主要是是类中的方法以及属性,继承中有两个不得不知的概念。父类与子类,基类与派生类。子类继承父类中的属性与方法。不同的子类不存在继承关系。子类继承父类与父类的父类。
7.什么是重写?
所谓重写即父类有一个方法,子类继承了这个方法,但是子类特立独行,想再创造,在自己的类中创建一个名字相同的方法,这个方法实现原先功能的再创造。打个比方,我父亲原先只会开摩托车,那到这了,我只会开汽艇不会开摩托车。这就是重写。
8.怎么调用被重写的父类方法
思考两个问题
1.为什么调用父类中的方法
有这样一个场景,我父亲会骑摩托车,那我不仅仅会开飞机也会开摩托车(继承父亲的开车本领),那这种场景就类似我既有自己的一套方法,也要继承父亲的方法。
2.怎么调用(有两种方法)
一种是在子类的方法中,重新调用,格式如下(场景:哮天犬先是狂叫,尔后能量耗尽,变成汪汪叫)
class Dog(self): def bark(self): print("汪汪叫") class xiaoqt(self): def bark(self): print("狂叫") #第一种方案 Dog.bark(self) #第二种方案(调用父类中的重写) super().bark()
9.私有方法、私有属性在继承中的表现
一般而言,私有方法不被子类继承,那就好比小明的父亲总有一些事是他私有的,并不想告诉小明。那如何让子类继承父类中的方法呢,可以这样,父类定义了一个公有方法,这个公有方案调用了私有方案,那我子类就可以继承父类中的公有方法中的私有方法。这就好比小明的父亲,哪天一开心就把自己的私事告诉了小明。
10.什么是多继承
骡子继承了马和驴的特性,这就是多继承。C继承A和B,那C同时继承了A和B类的方法及属性。
多继承的注意点:
尽可能避免多个父类和子类出现相同的方法名。
11.什么是多态
多态,多种状态,即见人说人话,见鬼说鬼话。多态即我即可以调用父类的方法,也可以调用子类的方法。取决于传入对象参数调用了哪个类。
class Dog(self): def bark(self): print("汪汪叫") class xiaoqt(self): def bark(self): print("狂叫") def msg(temp): temp dog1 = Dog() dog2 = xiaotq() msg(dog1) msg(dog2) 函数msg()分别调用两个对象dog1,dog2,传入的参数对象进行赋值,调用不同对象,输出结果不同。
12.什么是面向对象的三要素?
面向对象的三要素:封装、继承、多态。
封装,即类把函数,全局变量封装起来。继承,即子类继承父类中的属性及方法。多态,变量调用的数据类型不确定,所具有的功能也不确定。
13.什么是类属性,实例属性?
创建对象即类的实例化,所以实例属性即是对象的属性,也可以理解为对象的变量。比如我有一个工具对象,那工具对象的实例属性可以是锤子,扳手,剪刀。你可以知道这些实例属×××各不相同,在对象之间互不共用。既可以理解为,实例属性在不同的实例对象中,是不同通用的。那类的属相属于每一个实例对象。
14.实例方法、类方法、静态方法
实例方法和实例属性是关联的,类方法和类属性是关联的,静态方法两种都不关联。那有这么一种情况,我即不想引用类属性,也不想引用实例属性,那这个时候就用静态方法。类方法是对类属性进行引用,实例方法是对实例属性进行引用,静态方法两个属性都不引用,
也不引用属性。
定义类方法必须加上类属性,比如这样
@classmethod def add_num(cls): cls.num = 110
定义实例方法必须加上实例属性
def __init(self,name) self.name = huwho
静态方法不需要加上属性
@staticmethod def print_menu():