Python 对象的知识

举报
Yuchuan 发表于 2020/02/07 21:33:39 2020/02/07
【摘要】 python 对象的学习笔记。

一、对象的相关知识

回到咱们的美女大战野兽:现在我们需要对我们的类做出一点点改变
人类除了可以走路之外,还应该具备一些攻击技能。

class Person:  # 定义一个人类
    role = 'person'  # 人的角色属性都是人

    def __init__(self, name, attack_power, life_value):
        self.name = name  # 每一个角色都有自己的昵称;
        self.attack_power = attack_power  # 每一个角色都有自己的攻击力;
        self.life_value = life_value  # 每一个角色都有自己的生命值;

    def attack(self, wild_animal):
        # 美女可以攻击野兽,这里的野兽也是一个对象。
        # 美女攻击野兽,那么野兽的生命值就会根据美女的攻击力而下降
        wild_animal.life_value -= self.attack_power

1、对象是关于类而实际存在的一个例子,即实例

2、对象/实例只有一种作用:属性引用

lola = Person('lola', 100, 10000)
print(lola.name)
print(lola.attack_power)
print(lola.life_value)

结果:

D:\YuchuanProjectData\PythonProject\venv\Scripts\python.exe D:/YuchuanProjectData/PythonProject/Yuchuan_class_info0001.py
lola
100
10000
Process finished with exit code 0

当然了,你也可以引用一个方法,因为方法也是一个属性,只不过是一个类似函数的属性,我们也管它叫动态属性。
引用动态属性并不是执行这个方法,要想调用方法和调用函数是一样的,都需要在后面加上括号

print(lola.attack)

<bound method Person.attack of <__main__.Person object at 0x0000024DF145D7F0>>

我知道在类里说,你可能还有好多地方不能理解。那我们就用函数来解释一下这个类呀,对象呀到底是个啥,你偷偷的用这个理解就好了,不要告诉别人

帮你了解面向对象:

def Person(*args, **kwargs):
    self = {}

    def attack(self, dog):
        dog['life_value'] -= self['attack_power']

    def __init__(name, attack_power, life_value):
        self['name'] = name
        self['attack_power'] = attack_power
        self['life_value'] = life_value
        self['attack'] = attack

    __init__(*args, **kwargs)
    return self

lola = Person('lola', 168, 111896)
print(lola['name'])

结果:

D:\YuchuanProjectData\PythonProject\venv\Scripts\python.exe D:/YuchuanProjectData/PythonProject/Yuchuan_class_info0001.py
lola
Process finished with exit code 0

面向对象小结——定义及调用的固定模式

小结:

class 类名:
    def __init__(self,参数1,参数2):
        self.对象的属性1 = 参数1
        self.对象的属性2 = 参数2

    def 方法名(self):pass

    def 方法名2(self):pass

对象名 = 类名(1,2)  #对象就是实例,代表一个具体的东西
                  #类名() : 类名+括号就是实例化一个类,相当于调用了__init__方法
                  #括号里传参数,参数不需要传self,其他与init中的形参一一对应
                  #结果返回一个对象
对象名.对象的属性1   #查看对象的属性,直接用 对象名.属性名 即可
对象名.方法名()     #调用类中的方法,直接用 对象名.方法名() 即可

练习:

练习一:在终端输出如下信息

三毛,12岁,女,上山去砍柴
三毛,12岁,女,开车去泡妞
三毛,12岁,女,最爱大保健
张三,36岁,男,上山去***
张三,36岁,男,开车去泡妞
张三,36岁,男,最爱大保健
李四…

二、对象之间的交互

现在我们已经有一个人类了,通过给人类一些具体的属性我们就可以拿到一个实实在在的人。
现在我们要再创建一个野兽类,野兽就不能打人了,只能咬人,所以我们给狗一个bite方法。
有了野兽类,我们还要实例化一只实实在在的野兽出来。
然后人和野兽就可以搞起来了。现在我们就来让他们搞起来吧!

1、创建一个野兽类

class WildAnimal:  # 定义一个野兽类
    role = 'wild_animal'  # 野兽的角色属性都是野兽

    def __init__(self, name, breed, attack_power, life_value):
        self.name = name  # 每一只野兽都有自己的昵称;
        self.breed = breed  # 每一只野兽都有自己的品种;
        self.attack_power = attack_power  # 每一只野兽都有自己的攻击力;
        self.life_value = life_value  # 每一只野兽都有自己的生命值;

    def bite(self, Person):
        # 野兽可以咬人,这里的野兽也是一个对象。
        # 野兽咬人,那么人的生命值就会根据野兽的攻击力而下降
        Person.life_value -= self.attack_power

2、实例化一只实实在在的狼

wolf_king = WildAnimal('狼王', '野狼', 998, 88989)  # 创造了一只实实在在的狼

3、交互 lola打wolf_king一下

wolf_king = WildAnimal('狼王', '野狼', 998, 88989)  # 创造了一只实实在在的狼
print(wolf_king.life_value)  # 看看wolf_king的生命值
lola.attack(wolf_king)  # egg打了wolf_king一下
print(wolf_king.life_value)  # wolf_king掉了100点血

结果:

D:\YuchuanProjectData\PythonProject\venv\Scripts\python.exe D:/YuchuanProjectData/PythonProject/Yuchuan_class_info0001.py
88989
88889
Process finished with exit code 0

4、完整的代码

class Person:  # 定义一个人类
    role = 'person'  # 人的角色属性都是人

    def __init__(self, name, attack_power, life_value):
        self.name = name  # 每一个角色都有自己的昵称;
        self.attack_power = attack_power  # 每一个角色都有自己的攻击力;
        self.life_value = life_value  # 每一个角色都有自己的生命值;

    def attack(self, wild_animal):
        # 美女可以攻击野兽,这里的野兽也是一个对象。
        # 美女攻击野兽,那么野兽的生命值就会根据美女的攻击力而下降
        wild_animal.life_value -= self.attack_power

lola = Person('lola', 100, 10000)
# print(lola.name)
# print(lola.attack_power)
# print(lola.life_value)
# print(lola.attack)

class WildAnimal:  # 定义一个野兽类
    role = 'wild_animal'  # 野兽的角色属性都是野兽

    def __init__(self, name, breed, attack_power, life_value):
        self.name = name  # 每一只野兽都有自己的昵称;
        self.breed = breed  # 每一只野兽都有自己的品种;
        self.attack_power = attack_power  # 每一只野兽都有自己的攻击力;
        self.life_value = life_value  # 每一只野兽都有自己的生命值;

    def bite(self, Person):
        # 野兽可以咬人,这里的野兽也是一个对象。
        # 野兽咬人,那么人的生命值就会根据野兽的攻击力而下降
        Person.life_value -= self.attack_power

wolf_king = WildAnimal('狼王', '野狼', 998, 88989)  # 创造了一只实实在在的狼
print(wolf_king.life_value)  # 看看wolf_king的生命值
lola.attack(wolf_king)  # egg打了wolf_king一下
print(wolf_king.life_value)  # wolf_king掉了100点血
一个简单的例子帮你理解面向对象
from math import pi

class Circle:
    """
    定义了一个圆形类;
    提供计算面积(area)和周长(perimeter)的方法
    """

    def __init__(self, radius):
        self.radius = radius

    def area(self):
        return pi * self.radius * self.radius

    def perimeter(self):
        return 2 * pi * self.radius


circle = Circle(10)  # 实例化一个圆
area1 = circle.area()  # 计算圆面积
per1 = circle.perimeter()  # 计算圆周长
print(area1, per1)  # 打印圆面积和周长

结果:

D:\YuchuanProjectData\PythonProject\venv\Scripts\python.exe D:/YuchuanProjectData/PythonProject/Yuchuan_class_info0001.py
314.1592653589793 62.83185307179586
Process finished with exit code 0


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。