鱼C论坛

 找回密码
 立即注册
查看: 1504|回复: 9

[已解决]python 第37课 动动手0 关于类的问题

[复制链接]
发表于 2018-4-27 22:09:38 | 显示全部楼层 |阅读模式
5鱼币
题目:定义一个游乐园门票的类,并尝试计算2个小孩和1个成人门票的价格:
平日门票 100   周末门票为平日门票的120%   儿童半票

  1. class Ticket():
  2.         def __init__(self, weekend=False, child=False):
  3.                 self.exp = 100
  4.                 if weekend:
  5.                         self.inc = 1.2
  6.                 else:
  7.                         self.inc = 1
  8.                 if child:
  9.                         self.discount = 0.5
  10.                 else:
  11.                         self.discount = 1
  12.         def calcPrice(self, num):
  13.                 return self.exp * self.inc * self.discount * num

  14. >>> adult = Ticket()
  15. >>> child = Ticket(child=True)
  16. >>> print("2个成人 + 1个小孩平日票价为:%.2f" % (adult.calcPrice(2) + child.calcPrice(1)))
  17. 2个成人 + 1个小孩平日票价为:250.00
复制代码


以上是课后作业的答案
疑问1:self.exp = 100         self.inc = 1.2          self.discount = 0.5  这里的 exp,inc,discount 是什么鬼 这些是对象么  可以随便添加的么?  
我看书上和视频里都是 再上面有这个变量 然后才 self.变量
疑问2:求注释一下 return self.exp * self.inc * self.discount * num 这句
最佳答案
2018-4-27 22:09:39
屁哥 发表于 2018-4-29 09:46
疑问2:求注释一下 return self.exp * self.inc * self.discount * num 这句
谢谢指点

很简单啊,就是
返回  票价平价×节假日比率×折扣比率×票数

最佳答案

查看完整内容

很简单啊,就是 返回 票价平价×节假日比率×折扣比率×票数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-4-27 22:09:39 | 显示全部楼层    本楼为最佳答案   
屁哥 发表于 2018-4-29 09:46
疑问2:求注释一下 return self.exp * self.inc * self.discount * num 这句
谢谢指点

很简单啊,就是
返回  票价平价×节假日比率×折扣比率×票数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-4-27 22:26:42 | 显示全部楼层
本帖最后由 ABC23 于 2018-4-27 22:43 编辑

      
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-4-27 22:37:59 | 显示全部楼层

,

本帖最后由 ABC23 于 2018-4-27 22:48 编辑

self.data = 1        # 这是为类实例之属性赋值
===============================
对比Java看其实非常简单:

public class Demo{
       
        int data = 1;        // Java的术语,这叫字段(field),即实例的属性
       
        Demo(){}

        public static void main(String[] args){
                System.out.println(new Demo().data);        // 这会打印1,每个实例对象都人手一份,各个实例的filed之间互不影响
        }
}

回到Python:

Python的self(不是关键字)相当于Java的this(关键字)

class Demo:
        def __init__(self):
                self.data = 1

这等价于Java的字段赋值

——事实上,Python的__init__()方法同时担当了Java的:1. 字段赋值,2.  构造方法这重身份(并且init方法充当constructor的部分还不准确,因为它封装了new方法,那个才是构造实例时真正会调用的方法)。请看:

class Demo:
        def __init__(self, item, price):
                self.item = price
                self.price  = price
                self. data = 100

这段代码同时表现了init方法作为字段赋值和构造方法的两重身份

为什么为字段赋值要写在init方法中?其实写在普通的成员方法中可是可以的:

>>> class Demo:
        def f(self):
                self.value = 1

               
>>> d = Demo()
>>> dir(d)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'f']
>>> d.value
Traceback (most recent call last):
  File "<pyshell#13>", line 1, in <module>
    d.value
AttributeError: 'Demo' object has no attribute 'value'
>>> d.f()
>>> d.value
1
>>> dir(d)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'f', 'value']

这体现了Python的动态类型之特点,比较灵活
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-4-27 23:07:00 | 显示全部楼层
ABC23 发表于 2018-4-27 22:37
self.data = 1        # 这是为类实例之属性赋值
===============================
对比Java看其实非常简单:

高手
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-4-28 00:35:35 | 显示全部楼层
因为python里没有变量的申明这个步骤,所以变量确实是想加就加的
不过与平常的变量不同的是,类中的实例的变量要加self这个前缀的,如果不加这个前缀,直接用变量名的话,这个变量是不会随着实例 的变化而变化的,就是每个例的这个变量值一直是一样的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-4-29 09:45:17 | 显示全部楼层
BlueSand 发表于 2018-4-28 00:35
因为python里没有变量的申明这个步骤,所以变量确实是想加就加的
不过与平常的变量不同的是,类中的实例的 ...

知道了  想加就加  变量这个懂了
  1. class Ticket():
  2.     def __init__(self, weekend=Flase, child=Flase):
  3.         self.exp = 100
  4.         if weekend:
  5.             self.inc = 1.2
  6.         else:
  7.             self.inc = 1
  8.         if child:
  9.             self.discount = 0.5
  10.         else:
  11.             self.discount = 1
  12.     def calcPrice(self, num):
  13.         return self.exp * self.inc * self.discount * num
  14.     [color=Red]# 这里两个成人+上一个孩子,这句话怎么理解的? num 被传入了什么值?[/color]
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-4-29 09:46:12 | 显示全部楼层
BlueSand 发表于 2018-4-28 00:35
因为python里没有变量的申明这个步骤,所以变量确实是想加就加的
不过与平常的变量不同的是,类中的实例的 ...

疑问2:求注释一下 return self.exp * self.inc * self.discount * num 这句
谢谢指点
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-4-29 13:02:52 | 显示全部楼层
塔利班 发表于 2018-4-29 11:33
很简单啊,就是
返回  票价平价×节假日比率×折扣比率×票数

class Ticket():
    def __init__(self, weekend=Flase, child=Flase):
        self.exp = 100 #exp 票价平价
        if weekend:
            self.inc = 1.2  # inc 节假日比率
        else:
            self.inc = 1
        if child:
            self.discount = 0.5 # discount 折扣比率
        else:
            self.discount = 1
    def calcPrice(self, num):  # num 票数
        return self.exp * self.inc * self.discount * num
           # 返回  票价平价×节假日比率×折扣比率×   票数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-4-29 13:03:22 | 显示全部楼层
BlueSand 发表于 2018-4-28 00:35
因为python里没有变量的申明这个步骤,所以变量确实是想加就加的
不过与平常的变量不同的是,类中的实例的 ...

谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-25 18:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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