Python: Task07:类、对象与魔法方法

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做一个简单的定时器类

要求:

  • 定制一个计时器的类。
  • startstop方法代表启动计时和停止计时。
  • 假设计时器对象t1print(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秒

猜你喜欢

转载自blog.csdn.net/zhaohaobingniu/article/details/113745681