Task07:类、对象与魔法方法
基本语句:
class name: #类的名字第一个字母大写
#属性
color = "green"
#方法
def run(self):
print("run")
object = name() #对象
x = object.color
object.run()
私有共有:
前面加上“__”两个下划线
__secretCount = 0 # 私有变量
def __foo(self): # 私有方法
print('这是私有方法')
继承:
class DerivedClassName(BaseClassName): #子类名(父类名)
self:
class Stest:
def p(self): # 可将self理解为实例t
print(self)
print(self.__class__)
t = Stest()
t.p()
魔法方法:
双下划线包围。
是内置方法,使用的时候被自动调用。
__new__负责创建类的实例对象,__init__负责对__new__创建的对象进行初始化,二者都由Python解释器自动调用。最后自动调用def del(self):析构器。
实例化时候先调用__new__(cls,[]),将值传给__init__(self, ,),调用__init__
不用调用方法,调用类的时候自动执行
#实例化时候先调用__new__(cls,[]),将值传给__init__(self, ,),调用__init__
#init(self, ,)构造器,实例被创建的时候调用的初始化方法
#子类
class A(object):
def __init__(self, value):
print("into A __init__")
self.value = value
def __new__(cls, *args, **kwargs):
print("into A __new__")
print(cls)
return object.__new__(cls)
class B(A):
def __init__(self, value):
print("into B __init__")
self.value = value
def __new__(cls, *args, **kwargs):
print("into B __new__")
print(cls)
return super().__new__(cls, *args, **kwargs)
b = B(10)
#实例化时候先调用__new__(cls,[]),将值传给__init__(self, ,),调用__init__
#__init__(self, ,)构造器,实例被创建的时候调用的初始化方法
# 结果:
# into B __new__
# <class '__main__.B'>
# into A __new__
# <class '__main__.B'>
# into B __init__
class Cat:
"""定义一个猫类"""
def __init__(self, new_name, new_age):
"""在创建完对象之后 会自动调用, 它完成对象的初始化的功能"""
self.name = new_name
self.age = new_age
def __del__(self):
print('into C __del__')
def __str__(self):
"""返回一个对象的描述信息"""
return "名字是:%s , 年龄是:%d" % (self.name, self.age)
def __repr__(self):
"""返回一个对象的描述信息"""
return "Cat:(%s,%d)" % (self.name, self.age)
def eat(self):
print("%s在吃鱼...." % self.name)
def drink(self):
print("%s在喝可乐..." % self.name)
def introduce(self):
print("名字是:%s, 年龄是:%d" % (self.name, self.age))
# 创建了一个对象
tom = Cat("汤姆", 30)
print(tom) # 名字是:汤姆 , 年龄是:30
print(str(tom)) # 名字是:汤姆 , 年龄是:30
print(repr(tom)) # Cat:(汤姆,30)
tom.eat() # 汤姆在吃鱼....
tom.introduce() # 名字是:汤姆, 年龄是:30
迭代器:迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。
练习题:
1、以下类定义中哪些是类属性,哪些是实例属性?
class C:
num = 0 #类属性
def __init__(self): #实例属性
self.x = 4
self.y = 5
C.count = 6
2、怎么定义私有⽅法?
前面加“__”
3、尝试执行以下代码,并解释错误原因:
class C:
def myFun():
print('Hello!')
c = C()
c.myFun()
class C:
def myFun(srlf):
print('Hello!')
c = C()
c.myFun()
4、按照以下要求定义一个游乐园门票的类,并尝试计算2个成人+1个小孩平日票价。
要求:
- 平日票价100元
- 周末票价为平日的120%
- 儿童票半价
class adultTicket():
weekday = 100
weekend = 120
class childTicket():
weekday = adultTicket.weekday/2
weekend = 60
adultTicket = adultTicket()
childTicket = childTicket()
print(2*adultTicket.weekday+childTicket.weekday)
练习题:
1、上面提到了许多魔法方法,如__new__
,__init__
, __str__
,__rstr__
,__getitem__
,__setitem__
等等,请总结它们各自的使用方法。
如上
2、利用python做一个简单的定时器类
要求:
- 定制一个计时器的类。
start
和stop
方法代表启动计时和停止计时。- 假设计时器对象
t1
,print(t1)
和直接调用t1
均显示结果。 - 当计时器未启动或已经停止计时时,调用
stop
方法会给予温馨的提示。 - 两个计时器对象可以进行相加:
t1+t2
。 - 只能使用提供的有限资源完成。
import time
class Mytime(object):
def __init__(self):
self.__info = '未开始计时!'
self.__begin = None
self.__end = None
self.__jg = 0
def __str__(self):
return self.__info
def __repr__(self):
return self.__info
def start(self):
print('计时开始...')
self.__begin = time.localtime()
def stop(self):
if not self.__begin:
print('提示:请先调用start()开始计时!')
return
self.__end = time.localtime()
self.__jg = time.mktime(self.__end) - time.mktime(self.__begin)
self.__info = '运行了%d秒' % self.__jg
print('计时结束!')
return self.__jg
def __add__(self, other):#加号重载
return '共运行了%d秒' % (other.__jg + self.__jg)
t1 = Mytime()
print(t1)
# 未开始计时!
t1.stop()
# 提示:请先调用start()开始计时!
t1.start()
# 计时开始...
time.sleep(5)
t1.stop()
# 计时结束!
print(t1)
# 运行了5秒
t2 = Mytime()
t2.start()
# 计时开始...
time.sleep(7)
t2.stop()
# 计时结束!
print(t2)
# 运行了7秒
print(t1 + t2)
# 共运行了12秒