python3面向对象编程一(类)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38165374/article/details/70197718
面向对象编程一(类)
一.必须要知道的基础知识点
1.类:可以理解为一个容器,里面保存了一些定义好的方法和基本的属性,可以创建出N个具有类似功能的实例对象。
2.类方法:可以理解为定义在类中具有一些功能的函数。
3.属性:一个类里面分为两种属性,一个是对象属性,一个是类属性,对象属性只有实例对象自己可以使用,类属性为这个类创建出来的 所有实例对象都可以使用。
4.特殊的类属性
1
C.__name__
类C的字符串
2
C.__doc__
类C的文档字符串
3
C.__bases__
类C的所有父类构成的元组
4
C.__dict__
类C 的属性
5
C.__module__
类C定义所在的模块
6
.C.__class__
类C对应的类(查看类C是谁创建的)
5.构造器(魔法方法)
1.__init__()方法,可以理解为初始化方法。
当类被调用的时候第一步是创建实例对象,一旦对象被创建python解释器就会调用类中的__init__()方法为实例对象添加预先定义的一些属性,如果类中没有定义这个方法, python解释器会去在这个类的父类中寻找,如果父类没有就会调用默认的__init__()方法。
2.__new__()方法,创建一个实例对象。
__new__()执行在__init__()方法之前,它是真正的创建出一个实例对象,可以和__init__()方法配合使用实现单例(只创建一个对象)的效果。

class Dl(object):
__number1 = None
__number2 = None

# 重写父类的__new__方法
def __new__(cls, *args):
if cls.__number1 is None:
cls.__number1 = object.__new__(cls)
return cls.__number1

# 对创建出来的对象进行初始化
def __init__(self, new_name):
if self.__number2 is None:
self.name = new_name
# 第一次初始化之后修改类属性
# 第二次调用的时候条件不满足无法初始化
Dl.__number2 = True

if __name__ =="__main__":
people1 = Dl("zhangsan")
print(people1.name)
people2 = Dl("lisi")
print(people2.name)

两次的输出的结果相同:
zhangsan
zhangsan
6.解构器(魔法方法)
1.__del__()删除对象
       当一个对象的引用计数为0的时候会自动调用__del__()方法释放这个对象占用的内存,有的时候我们可以重写这个方法实现在删除对象的时候返回一些信息达到一些效果(就像游戏中击杀一个英雄的时候返回的一个击杀信息类似)
7.实例属性(创建出来的实例对象拥有的只属于自己的属性)
1.在创建完成一个对象的时候第一步就是自动调用__init__()方法,所以默认的一些属性我们会在这里设置。
2.python支持动态(运行过程中)添加实例属性,但是要注意的是如果属性在条件语句中添加时,如果这段代码没有执行,在后面使用这个属性的时候会报错。
8.实例属性vs类属性

实例属性(实例对象拥有的属性)
类属性
只有实例自己可以使用
可以通过类和实例来访问
实例对象不可以直接修改类属性,只是在实例对象中创建了一个与类属性同名的实例属性,如需修改需要调用类方法来修改。
可以直接通过类修改类属性(C.value +=1)
公有的类属性修改后,实例对象里面公用的类属性也会被修改。



9.静态方法
定义在类中的函数,没有实例对象(参数不需要写self),这个类的实例对象和类都可以直接调用静态方法。
创建静态方法:在需要定义为静态方法的函数上面加上@staticmethod,实际上这就是一个装饰器,staticmethon为内建函数。
10.类方法
创建方法:@classmethod
11.组合--->当类之间有显著的不同,并且较小的类的功能是较大的类的组建的时候使用组合
类中包含其他类的实例对象,可以理解为一个类中的某些功能是其它类创建出来的实例对象,这样使用方便以后的功能升级。

class NewAddrBookEntry(object):
def __init__(self, nm, ph):
# 初始化的名字和电话的属性是由Name和Phone两个类创建出来的实例对象
self.name = Name(nm)
self.phone = Phone(ph)
print(self.name)
12.继承--->当类之间基本相同,只有部分功能不同的时候使用继承
1.继承分单继承(有一个父类)和多继承(有多个父类)。
2.重写:当对继承的父类中的一些方法不满意的时候可以在子类中重新定义这个方法。
重新调用父类里面的方法
方法一:super(子类名字,self).方法名字(*args,**kwargs)或super().方法名( *args,**kwargs),如果改变类的继承关系的时候只改变一句代码(class语句本身),不需要在去寻找原先父类的名字去一个个修改。
方法二:父类名.方法名(self, *args,**kwargs),原理:由于已经对父类中的方法进行了重写,所以父类中的这个方法属于未绑定状态,所以在重新调用的时候需要将这个子类的实例对象传给这个父类绑定后才可以调用,不推荐使用这个方法。
3.旧式类的多继承是深度继承,新式类多继承是广度优先,可以使用__mro__属性查询搜索顺序
13.私有化
子类或实例对象不可以直接访问部分属性的一种措施,起到隐藏属性的作用,实际上这种隐藏很容易破解,使用的主要目的是对导入源代码无法获得的模块或对同一模块中其他代码的保护机制。
python实现私有化的原理:名字重整(name mangline), python解释器将私有方法或属性的名字前面加上了一个下划线和类名,这样就改变了这个属性的标识符,起到了不能直接访问的作用。
1.双下划线(__),
前双下划线的变量名或方法名子类和类对象都不可访直接访问。
2.单下划线(_)
前单下划线的变量或方法名 类对象和子类可以访问 ,但是不可以通过from 模块名 import *的方式导入,只可以使用import的方法导入
3.当实例对象需要访问私有属性或私有方法的时候需要单独定义一个普通的方法,通过这个方法间接调用私有属性和方法.

猜你喜欢

转载自blog.csdn.net/qq_38165374/article/details/70197718