python中的面向对象

一、什么是类

关键字   class    规则同变量名    规范  一般使用大驼峰表示(单词首字母大写)

class 类名:

  属性(类的一个属性,它来自组合,通常是一个变量)

  方法

二、什么是对象(object)

对象就是某个类的具体的一个实例。   根据数据类型创建一个对象,这个过程就叫做实例化。

类名()

三、类的属性

直接定义在类中的变量     就是类属性。

  访问类属性    类名.属性名             对象.属性名

四、对象属性

对象的特征数据被称为对象属性。

对象属性一般定义在构造方法中。

  对象.属性名 = 值      #直接赋值

五、方法

定义在类中的函数称为方法,通过调用方式不同,分为对象方法,类方法,静态方法和魔术方法。

1.对象方法

定义在类中的普通方法,不使用装饰器,第一个参数是self。

2.类方法

一个类方法就可以通过类或它的实例来调用的方法, 不管你是用类来调用这个方法还是类实例调用这个方法,该方法的第一个参数总是定义该方法的类对象。方法的第一个参数都是类对象而不是实例对象.。

3.静态方法

 要在类中使用静态方法,需在类成员函数前面加上@staticmethod标记符,以表示下面的成员函数是静态函数。使用静态方法的好处是,不需要定义实例即可使用这个方法。另外,多个实例共享此静态方法。

4.魔术方法

包起来的方法,统称为:魔术方法(Magic Method)。普通方法需要手动调用,而魔术方法是在特定的时刻自动触发执行的。

六、大常用魔术方法
1. __new__
(1). 说明:实例化对象方法
(2). 触发时机:在实例化时触发
(3). 参数:至少得有一个cls接收当前类,写法为__new__(cls, *args, **kwargs)
(4). 返回值:必须使用return关键字返回一个对象实例
(5). 作用:实例化(创建)对象,开辟内存地址空间对象并返回
(6). 注意:实例化对象是Object类底层实现,其他类继承了Object的__new__才能够实现实例化对象
2. __init__
(1). 说明:初始化方法,相当于java中的构造方法,在__new__执行后被调用
(2). 触发时机:初始化对象时触发(区别于__new__实例化时的触发)
(3). 参数:至少得有一个self接收__new__方法返回的对象,写法为__init__(self, name, age)
(4). 返回值:无
(5). 作用:初始化对象的成员
(6). 注意:使用该方式初始化的成员都是直接写入对象当中,类中无法具有
3. __del__
(1). 说明:析构魔术方法
(2). 触发时机:当一块地址空间没有任何指针引用的时候被触发在 Python 解释器中,当所有代码程序执行完成则会进行垃圾回收,也叫内存释放,这时就会触发__del__方法使用del 对象名显示删除引用关系时,如果此操作将某块地址空间的最后一个引用关系给删除,则会触发__del__方法
(3). 参数:仅只一个self参数接收对象
(4). 返回值:无
(5). 作用:使用完对象时回收资源,没有指针引用的时候会调用,绝大多数时候不需要重写
(6). 注意:del 对象名不一定会触发当前方法,只有某块地址空间无任何引用时才会触发
4. __call__
(1). 说明:调用对象函数的魔术方法
(2). 触发时机:将对象当作函数调用时触发,使用形式为对象名称(),会默认调用__call__函数里的内容
(3). 参数:至少得有一个self接收对象,剩余参数根据调用时传入的参数决定,写法为__call__(self, args)
(4). 返回值:根据具体重写逻辑而定
(5). 作用:将复杂的步骤统一放在该函数内实现,减少调用的步骤,比较方便
(6). 注意:无
5. __str__
(1). 说明:当print(对象名)时想看到更多的信息时,可以重写__str__方法,将想要输出的信息放在__str__函数中返回
(2). 触发时机:使用print(对象名)或者str(对象名)的时候触发
(3). 参数:一个self参数接收对象
(4). 返回值:必须是字符串类型
(5). 作用:print(对象名)时可以自定义输出更多有用信息
(6). 注意:无

示例代码:

class People:  # 类名Person后面加不加(Object)效果是一样的,都表示继承自Object类
# 创建对象
def __new__(cls, *args, **kwargs):
print('调用__new__构造方法')
position = super().__new__(cls) # 调用父类的__new__()方法创建对象,开辟内存空间
# print(position) # <__main__.People object at 0x7fa19b8a6c10>
return position # 将创建的地址空间对象返回,交给__init__方法接收

# 实例化对象
def __init__(self, name, age):
self.name = name # 在__new__方法返回的内存空间地址中放置name属性
self.age = age # 在__new__方法返回的内存空间地址中放置age属性
# print(self) # <__main__.People object at 0x7fa19b8a6c10>
print('调用__init__初始化方法')

# 对象作为函数调用时的逻辑
def __call__(self, args):
print('调用__call__方法,接收到的参数为:%s' % args)

# 删除对象: 在(del 对象名后所对应的地址空间无任何引用时)或者程序执行结束之后
def __del__(self):
print('调用__del__析构方法,删除对象,释放内存空间')

# 自定义print(对象名)时的输出内容
def __str__(self):
return '对象的name是:' + self.name + ',对象的age是:' + str(self.age)


if __name__ == '__main__':
p = People('liuming', 20)
# print(p) # <__main__.People object at 0x7fa19b8a6c10>
p('abc') # 调用__call__方法
p1 = p
p2 = p
p3 = p # 截止到这里p对象所在的地址空间,共有4个对象都在引用,分别是对象:p,p1,p2,p3
del p3 # 删除的是p3对内存地址空间的引用关系,此时p对象所在的地址空间,共有3个对象在引用,分别是对象:p,p1,p2
del p2
del p1
del p # 自动调用__del__方法,因为p对象所在的地址空间已经没有任何对象在引用了,所以需要对内存地址进行回收释放
p4 = People('xiaohong', 18)
print(p4) # 对象的name是:xiaohong,对象的age是:18---注意:此时输出的不再是地址空间值了,而是__str__函数自定义return的内容
print(str(p4)) # 输出内容同print(p4)

输出代码:

调用__new__构造方法
调用__init__初始化方法
调用__call__方法,接收到的参数为:abc
调用__del__析构方法,删除对象,释放内存空间
调用__new__构造方法
调用__init__初始化方法
对象的name是:xiaohong,对象的age是:18
对象的name是:xiaohong,对象的age是:18
调用__del__析构方法,删除对象,释放内存空间

以上部分内容节选自博客园文档~

http://www.360doc.com/content/22/0728/15/29968938_1041724266.shtml

 

posted @ 2021-03-15 23:08  軍子  阅读(58)  评论(0编辑  收藏  举报