鱼C论坛

 找回密码
 立即注册
查看: 3603|回复: 6

[已解决]定义类,__init__的作用是什么?

[复制链接]
发表于 2018-9-10 23:07:07 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 sonichuang 于 2018-9-10 23:39 编辑

class Ticket:
    def __init__(self, weekend = False, child = False):
        self.default = 100
        if weekend:
            self.rise = 1.2
        else:
            self.rise = 1
        if child:
            self.discount = 0.5
        else:
            self.discount = 1
    def final(self, num):
        return self.default * self.rise * self.discount * num

adult = Ticket()
child = Ticket(child = True)
print(adult.final(2) + child.final(1))


                               
登录/注册后可看大图


                               
登录/注册后可看大图

这段代码如果不用__init__可以写成这样:
class Ticket:
    default = 100
    def final(self, num, weekend = False, child = False):
        if weekend == True:
            self.rise = 1.2
        else:
            self.rise = 1
        if child == True:
            self.discount = 0.5
        else:
            self.discount = 1

        return self.default * self.rise * self.discount * num

adult = Ticket()
child = Ticket()
print(adult.final(2) + child.final(1, child = True))


__init__在代码中有什么呢?


最佳答案
2018-9-11 19:09:38
sonichuang 发表于 2018-9-11 17:41
你好,能不能帮忙结合我的这个例子说明一下,”如果不这样写,你的属性是默认的,不能改的,除非再写一个 ...

这个原先的代码是这样的
  1. class Ticket:
  2.     def __init__(self, weekend = False, child = False):
  3.         self.default = 100
  4.         if weekend:
  5.             self.rise = 1.2
  6.         else:
  7.             self.rise = 1
  8.         if child:
  9.             self.discount = 0.5
  10.         else:
  11.             self.discount = 1
  12.     def final(self, num):
  13.         return self.default * self.rise * self.discount * num

  14. adult = Ticket()
  15. child = Ticket(child = True)
  16. print(adult.final(2) + child.final(1))
复制代码

这个应该是答案里面的代码吧,你看现在他调用child实例的时候输入了参数child = True,这样在接下来的这个类中所有函数都可以知道这个参数,但是你的第二个代码,是在函数中设置默认参数,就意味着,我每次调用你的函数,我不仅得记忆你每个函数里面有些什么参数,还得再输一遍,就比如说现在出现了第三个函数,儿童可以额外参加什么活动,儿童可以抽奖,你就必须在后面两个函数调用的时候再输入一遍child = True
属性不能改变不是你这个例子里面的这个例子的self.default = 100,就已经确定了
正确的写法是下面这样
    def __init__(self, default=100,weekend = False, child = False):
        self.default = default
这样创建类的时候,你的默认票价是可以随时改的
而你另一种写法是改不了的,动不了类的属性,init函数就是提供一个可以让你调整属性的方法
代码少的时候不重要,代码多的时候就会变得很重要,就需要规范了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-9-11 08:13:45 | 显示全部楼层
在声明一个类对象的时候就完成初始化工作
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-11 08:23:05 From FishC Mobile | 显示全部楼层
BngThea 发表于 2018-9-11 08:13
在声明一个类对象的时候就完成初始化工作

进行初始化操作有什么好处呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-11 08:25:02 | 显示全部楼层
sonichuang 发表于 2018-9-11 08:23
进行初始化操作有什么好处呢?

实际应用中的绝大多数时候,我们在生成一个类对象的时候希望它的原始功能就已经具备了

评分

参与人数 1荣誉 +4 鱼币 +4 贡献 +3 收起 理由
sonichuang + 4 + 4 + 3 感谢回复

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-11 14:41:37 | 显示全部楼层
你即使没有写,仍然调用了这个函数,这样写的好处一是规范,二是可以在创建对象的同时向里面传入参数,设置属性
如果不这样写,你的属性是默认的,不能改的,除非再写一个专门修改参数的函数!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-11 17:41:56 From FishC Mobile | 显示全部楼层
RIXO 发表于 2018-9-11 14:41
你即使没有写,仍然调用了这个函数,这样写的好处一是规范,二是可以在创建对象的同时向里面传入参数,设置 ...

你好,能不能帮忙结合我的这个例子说明一下,”如果不这样写,你的属性是默认的,不能改的,除非再写一个专门修改参数的函数!”
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-11 19:09:38 | 显示全部楼层    本楼为最佳答案   
sonichuang 发表于 2018-9-11 17:41
你好,能不能帮忙结合我的这个例子说明一下,”如果不这样写,你的属性是默认的,不能改的,除非再写一个 ...

这个原先的代码是这样的
  1. class Ticket:
  2.     def __init__(self, weekend = False, child = False):
  3.         self.default = 100
  4.         if weekend:
  5.             self.rise = 1.2
  6.         else:
  7.             self.rise = 1
  8.         if child:
  9.             self.discount = 0.5
  10.         else:
  11.             self.discount = 1
  12.     def final(self, num):
  13.         return self.default * self.rise * self.discount * num

  14. adult = Ticket()
  15. child = Ticket(child = True)
  16. print(adult.final(2) + child.final(1))
复制代码

这个应该是答案里面的代码吧,你看现在他调用child实例的时候输入了参数child = True,这样在接下来的这个类中所有函数都可以知道这个参数,但是你的第二个代码,是在函数中设置默认参数,就意味着,我每次调用你的函数,我不仅得记忆你每个函数里面有些什么参数,还得再输一遍,就比如说现在出现了第三个函数,儿童可以额外参加什么活动,儿童可以抽奖,你就必须在后面两个函数调用的时候再输入一遍child = True
属性不能改变不是你这个例子里面的这个例子的self.default = 100,就已经确定了
正确的写法是下面这样
    def __init__(self, default=100,weekend = False, child = False):
        self.default = default
这样创建类的时候,你的默认票价是可以随时改的
而你另一种写法是改不了的,动不了类的属性,init函数就是提供一个可以让你调整属性的方法
代码少的时候不重要,代码多的时候就会变得很重要,就需要规范了

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
sonichuang + 5 + 5 + 3 感谢回复。

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-22 10:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表