Task07——类与对象、魔法方法

类与对象心得

  • 公有私有。在变量或者方法名称前面添加__表示为私有。
  • 需要调用子类重写的父类方法时,可以通过:
    • 调用父类未绑定的方法
    • 使用super函数
  • 类、类对象和实例对象
    • 属于一个抽象的概念。
    • 类对象是类概念的具象化,需要内存空间进行存放。
    • 实例对象是将类对象实例化的过程。
  • 类属性实例属性
    • 区别:
    • 类属性:类外面,可以通过实例对象.类属性类名.类属性进行调用。类里面,通过self.类属性类名.类属性进行调用。
    • 实例属性 :类外面,可以通过实例对象.实例属性调用。类里面,通过self.实例属性调用。
    • 实例属性就相当于局部变量。出了这个类或者这个类的实例对象,就没有作用了。
    • 类属性就相当于类里面的全局变量,可以和这个类的所有实例对象共享。
    • 例子:
# 创建类对象
class Test(object):
class_attr = 100 # 类属性
def __init__(self):
self.sl_attr = 100 # 实例属性
def func(self):
print('类对象.类属性的值:', Test.class_attr) # 调用类属性
print('self.类属性的值', self.class_attr) # 相当于把类属性 变成实例属性
print('self.实例属性的值', self.sl_attr) # 调用实例属性
a = Test()
a.func()
# 类对象.类属性的值: 100
# self.类属性的值 100
# self.实例属性的值 100
b = Test()
b.func()
# 类对象.类属性的值: 100
# self.类属性的值 100
# self.实例属性的值 100
a.class_attr = 200
a.sl_attr = 200
a.func()
# 类对象.类属性的值: 100
# self.类属性的值 200
# self.实例属性的值 200
b.func()
# 类对象.类属性的值: 100
# self.类属性的值 100
# self.实例属性的值 100
Test.class_attr = 300
a.func()
# 类对象.类属性的值: 300
# self.类属性的值 200
# self.实例属性的值 200
b.func()
# 类对象.类属性的值: 300
# self.类属性的值 300
# self.实例属性的值 100
  • 这个例子很方便理解。关于类属性同C#进行比较,有点类似类中的静态变量。

习题

'''
怎么定义私有⽅法?

在私有方法前面加双下划线"__"
'''
'''
尝试执行以下代码,并解释错误原因
class C:
	def myFun():
		print('Hello!')
	c = C()
	c.myFun()

定义了类C,又在其内部进行实例化,并在类型内调用内部方法,属于语法错误。
只需要将后两行缩进即可修正错误。
'''
'''
按照以下要求定义一个游乐园门票的类,并尝试计算2个成人+1个小孩平日票价。
平日票价100元
周末票价为平日的120%
儿童票半价
'''
class Ticket:
    def Members(self, old=0, yang = 0, isweekday=False):
        return (old+yang*0.5)*100*1.2 if isweekday else (old+yang*0.5)*100
    
t = Ticket()
print(t.Members(2,1))

魔法方法心得

  • 魔法方法很像C#中的自动化运行的方法
    • 基本魔法方法——析构方法
    • 算数运算符方法——重载运算符
    • 属性访问——属性
    • 描述符?
    • 定制序列——接口?
    • 迭代器——迭代器
    • 生成器?

关于魔法方法需要多加练习,进行使用。或者依托实战项目进行,或者学习大型开源项目。不过对于一些不常用的方法而言,仅仅属于了解的范畴,真正有用的是在实践中进行使用。

上述关于魔法方法,还有一些概念性的问题没有搞清楚,需要查阅资料进行深入学习。

习题

'''
利用python做一个简单的定时器类
要求:
1. 定制一个计时器的类。
2. start 和 stop 方法代表启动计时和停止计时。
3. 假设计时器对象 t1 , print(t1) 和直接调用 t1 均显示结果。
4. 当计时器未启动或已经停止计时时,调用 stop 方法会给予温馨的提示。
5. 两个计时器对象可以进行相加: t1+t2 。
6. 只能使用提供的有限资源完成。
'''
class MyTimer:
    __flag = False
    CurrentTime = 0
    def __init__(self, currentTime = 0):
        self.CurrentTime = currentTime
        
    def start(self):
        self.__flag = True
        self.CurrentTime = -1

    def stop(self):
        if self.__flag == True:
            self.__flag = False
            self.CurrentTime = 0
        else:
            print("计时器未运行,请先打开计时器。")

    def __str__(self):
        return str(self.CurrentTime)

    def __add__(self, others):
        return MyTimer(self.CurrentTime+others.CurrentTime)

t1 = MyTimer(10)
t1
print(t1)
t1.start()
print(t1)
t1.stop()
print(t1)
t1.stop()
print(t1)
t2 = MyTimer(20)
t1.start()
print(t1+t2)
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页