Task_07类、对象和魔法方法
在谈到类于对象就必然少不了面向对象是编程的基本概念。如下片段摘自百度百科,
面向对象编程(Object Oriented
Programming,OOP,面向对象程序设计)的主要思想是把构成问题的各个事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙一个事物在整个解决问题的步骤中的行为。面向对象程序设计中的概念主要包括:对象、类、数据抽象、继承、动态绑定、数据封装、多态性、消息传递。通过这些概念面向对象的思想得到了具体的体现。面对对象程序设计是尽可能地在模拟人类的思维。通过这样的方式能够让开发的软件更加符合人类的认知,人们使用起来也能够更加顺手。并且通过应用软件能够切实地解决现实生活中的问题。面向对象程序设计使得描述问题的问题空间和问题的解决方法空间组合在一起,并且尽可能地保持一致。能够将客观世界中的抽象问题转化为具体的问题对象。
简单的概括一下。类是一些属性与方法的抽象定义和实现。 这里我比作一个模板。 对象就是类做出来的具体的一个产品。这里我比作,利用模板做出的实际产品。类时不占用存储空间的,只有在利用类实例化一个对象的时候才会为对象分配内存。对象拥有类的属性和方法。同时,对象又可以与类的方法不同。就好比利用模板制作产品的时候,客户要求不需要原来的某一部分,这时候只需要把对象的这部分去除即可。这样不会对类本身造成破坏,又可以达到目的。很方便,有木有??? 就像复制,黏贴。但是我们只对黏贴后的内容作更改。
如下图,左边为类的定义。右边的唐老鸭,周黑鸭,丑小鸭,都是鸭子。不同的时,唐老鸭不会飞,不会游泳。 丑小鸭翅膀小,游不远。。。但是他们都是有鸭子的特性(这里换个名字,叫继承)。
类于对象的关系
关于魔法方法:这里简单理解就是在利用类实例化(如下的 tester = Test() )一个对象的时候会调用的初始化方法,且这种方法是自动实现的。此时的tester 就是一个Test 类的对象。我们同时可以定义无限多个对象(tester1, tester2…)哦。 实例化以后就是调用相应的方法和属性了。
class Test():
def __init__(self):
self.name = 5
self.age = 10
def Run(self):
pass
tester = Test()
tester1 = Test()
tester2 = Test()
关于类中变量与方法的公有与私有,这是一个很机智的设置。因为这个就可以实现数据安全或者核心方法的保密。在面向对象的编程方法中都会有私有与公有的区别。C++中是用关键字Public 和Private 进行区别。Python 是利用双下划线进行区别。这种方式比C++又简单多了。C++利用关键字还涉及作用域,缩进等稍有疏忽就容易引起错误。
关于继承,教程当中由于涉及得变量比较多,所以理解起来很费劲。所以我写了一个简单版本。
首先,子类继承父类得方法时,子类优先。
class Father():
def __init__(self,name):
self.name = name
def prints(self):
print(f"this from father, name is {self.name}")
class Son(Father):
def __init__(self, name):
self.name = name
# def prints(self):
# print(f'this from is son, name is {self.name}')
son = Son('MM')
son.prints()
###输出为: this from father, name is MM
可以看到,我得Son 类里面没有写Prints 得方法,调用的时候时调用的父类的方法。同样的,在子类可以不写初始化方法,可以直接使用父类的初始化方法和变量。如果子类重写了父类方法,那么子类的方法优先级最高。
class Father():
def __init__(self,name):
self.name = name
def prints(self):
print(f"this from father, name is {self.name}")
class Son(Father):
def __init__(self, name):
self.name = name
def prints(self):
print(f'this from is son, name is {self.name}')
son = Son('MM')
son.prints()
作业:::
执行如下代码,出现错误“NameError;name ‘C’ is not defined”. 可以看到下面的代码中, 实例化对象的时候,c = C() 由于缩进在类的作用域里面,所以’c =’ 被解释器当中一个赋值语句,在赋值的过程并没又在本文件,或者包内找到C()的类,所以提示名字为C的类或者方法没有找到。
class C:
def myFun():
print('Hello!')
c = C()
c.myFun()
售票的作业。
import time
class Ticket():
def __init__(self,DaRen_Num = 0, Xiaohai_Num= 0):
self.Daren_Num = DaRen_Num
self.Xiaohai_Num = Xiaohai_Num
__PingriPiaojia = 100
Price = 1 * __PingriPiaojia
today = int(time.strftime("%w")) # 获取当前时周几
if today > 5:
Price = 1.2 * __PingriPiaojia
self.Daren_Price = Price
self.Xiaohai_Price = Price*0.5
def Daren(self):
return self.Daren_Num * self.Daren_Price
def Xiaohai(self):
return self.Xiaohai_Num * self.Xiaohai_Price
def Total_Price(self):
return self.Daren() + self.Xiaohai()
test = Ticket(2,1)
print(test.Total_Price())
上一篇: cv基础组队学习