Python 面向对象(2)

本篇在《Python 面向对象(1)》基础上,对面向对象的构造函数、self是什么、析构函数、重写函数等内容进行讲解以及相关示例。

目录

构造函数

设置构造函数

实例化对象并赋值属性

self是什么

增加介绍方法

实例化对象

获取对象类名

self不是关键字

析构函数

设置析构函数

释放对象

函数中实例化对象

重写

设置str方法

打印对象

设置repr方法

打印对象

总结

Python 面向对象系列目录


构造函数

__init__() 在使用类创造对象的时候自动调用

注意:如果不显示的设置构造函数,则默认会创造一个空的构造函数。

设置构造函数

之前访问属性时还需要在实例化后,对对象属性进行赋值,

我希望在实例化对象后就拥有可以使用的属性,并且每个对象属性不同;

这可以使用构造函数实现,在实例化时就赋予它属性。

示例如下:

class Person(object):
    def run(self):
        print('跑步')

    def eat(self, food):
        print('吃%s' % food)

    def look(self, name):
        print('看%s' % name)

    def __init__(self, name, age, gender, height, weight):
        print('这里是init,开始赋值')
        self.name = name
        self.age = age
        self.gender = gender
        self.height = height
        self.weight = weight

可以看到最后增加了一个__init__的方法,它的参数有名称、年龄、性别、身高和体重。

并且去掉了原来类中的这些属性,也不会影响到构造函数为其赋值。

实例化对象并赋值属性

接下来开始实例化person类,并为其设置属性,这时候person的小括号里面就必须传参了,参数就是构造函数中设置的参数和顺序(除self外)。

示例如下:

p1 = Person('张三', 18, '男', 180, 80)
# 打印名称和年龄
print(p1.name, p1.age)

p2 = Person('李四', 18, '女', 165, 55)
# 打印名称和年龄
print(p2.name, p2.age)

# 执行结果
# 这里是init,开始赋值
# 张三 18
# 这里是init,开始赋值
# 李四 18

可以看到实例化都是首先执行构造函数去赋值,然后返回了张三和李四两个对象的名称和年龄,这就是构造函数。

self是什么

self代表类的实例,而非类

哪个对象调用方法,那么该方法中的self就代表那个对象

self.__class__代表类名。

增加介绍方法

在原来类的基础上增加了一个介绍方法,来进行自我介绍。

示例如下:

class Person(object):
    def run(self):
        print('跑步')

    def eat(self, food):
        print('吃%s' % food)

    def look(self, name):
        print('看%s' % name)

    def desc(self):
        print('你好,我的名字是%s,我的身高是%dcm!' % (self.name, self.height))

    def __init__(self, name, age, gender, height, weight):
        self.name = name
        self.age = age
        self.gender = gender
        self.height = height
        self.weight = weight

 

实例化对象

实例化两个对象,分别调用介绍方法。

示例如下:

p1 = Person('张三', 18, '男', 180, 80)
p1.desc()

p2 = Person('李四', 18, '女', 165, 55)
p2.desc()

# 执行结果
# 你好,我的名字是张三,我的身高是180cm!
# 你好,我的名字是李四,我的身高是165cm!

可以发现每次self调用的都是所实例化对象的属性内容,

也就是该方法中的self就代表当前实例化对象。

获取对象类名

通过self.__class__获取对象类名。在desc方法中增加打印。

示例如下:

def desc(self):
    print('你好,我的名字是%s,我的身高是%dcm!' % (self.name, self.height))
    print(self.__class__)

执行结果:

你好,我的名字是张三,我的身高是180cm!

你好,我的名字是李四,我的身高是165cm!

 

self不是关键字

self不是关键字,换成其他的标识符也是可以的,但通常会命名为self,

你可以理解为这是一种命名规范。

示例如下:

def desc(aa):
    print('你好,我的名字是%s,我的身高是%dcm!' % (aa.name, aa.height))
    print(aa.__class__)

换成aa后,执行结果没有任何改变;但是不提倡这么做,在项目开发中不容易理解容易产生误会,也会让别人认为你不专业。

析构函数

__del__() 释放对象,是自动调用的。

设置析构函数

在Person类中设置__del__方法,并在其中打印提示内容,

这样在自动调用析构函数时,我们可以看到调用提示。

示例如下:

class Person(object):
    def run(self):
        print('跑步')

    def eat(self, food):
        print('吃%s' % food)

    def look(self, name):
        print('看%s' % name)

    def __del__(self):
        print('这里是析构函数,将释放对象')

 

释放对象

实例化person类后,使用del删除对象即可释放对象。

示例如下:

p1 = Person()
del p1

# 一般程序结束 就会释放对象 通过while使程序暂时不结束 查看析构函数执行
while 1:
    pass

# 执行结果
# 这里是析构函数,将释放对象

对象释放后就不能再调用了。

函数中实例化对象

在函数中实例化的对象,会在函数结束的时候自动释放,所以程序没结束,我们也没删除对象就释放了。这样可以减少内存空间的浪费。

示例如下:

def test():
    p1 = Person()


test()
while True:
    pass

# 执行结果
# 这里是析构函数,将释放对象

重写

重写:将函数重新定义写一遍。

重写了__str__方法用法:

1.把对象以字符串输出。

2.当一个对象的属性值很多,并且都需要打印,可以简化代码。

设置str方法

在str方法中设置返回包含当前对象的姓名、年龄、性别、身高、体重等的字符串信息。

示例如下:

def __str__(self):
    return '姓名%s,年龄%d,性别%s,身高%d,体重%d' % (self.name, self.age, self.gender, self.height, self.weight)

 

打印对象

在实例化对象后,使用print打印当前实例化对象,如果设置了str方法就会自动调用。

示例如下:

p1 = Person('张三', 18, '男', 180, 80)
print(p1)

p2 = Person('李四', 18, '女', 165, 55)
print(p2)

# 执行结果
# 姓名张三,年龄18,性别男,身高180,体重80
# 姓名李四,年龄18,性别女,身高165,体重55

设置repr方法

设置repr方法与str方法处理做一点区别,并注释掉str方法。

示例如下:

# def __str__(self):
#     return '姓名%s,年龄%d,性别%s,身高%d,体重%d' % (self.name, self.age, self.gender, self.height, self.weight)

def __repr__(self):
    return '姓名%s-年龄%d-性别%s-身高%d-体重%d' % (self.name, self.age, self.gender, self.height, self.weight)

打印对象

当str方法没有设置,而设置了repr方法时,打印对象会自动调用repr方法。

示例如下:

p1 = Person('张三', 18, '男', 180, 80)
print(p1)

p2 = Person('李四', 18, '女', 165, 55)
print(p2)

# 执行结果
# 姓名张三-年龄18-性别男-身高180-体重80
# 姓名李四-年龄18-性别女-身高165-体重55

总结

本篇在《Python 面向对象(1)》基础上,对面向对象的构造函数、self是什么、析构函数、重写函数等内容进行讲解以及相关示例。

Python 面向对象系列目录

Python 面向对象(1)

你可能感兴趣的:(Python,开发语言,后端,python)