第九章 面向对象-2
9.1类与对象
类是一个抽象的概念,就像上面我给你很多阿猫阿狗的图片,问这是什么回答“动物”一样,动物就是一个类的概念。世界上没有动物这个东西,我们根据一些实际存在的阿猫阿狗,抽象出它们的共性得出了动物这个概念。而那些实际存在的一个一个看得到的阿猫阿狗就是一个个动物的具体实例,它们就对应对象的概念。因此,一个个能够区别的个体就是对象,也叫实例,而抽象的概念是类。试着想一个类似的例子吧,写在下面:
------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------
Ok,为了帮助你更好的理解,我再提供一个例子,看看下面这些好吃的:

你看到的是一个个对象,什么对象呢?水果对象,世界上没有哪一个东西是水果,因为如果我让你拿一个水果来,你拿来的肯定是一个具体的梨、菠萝、梅子、葡萄、椰子等等。我又想起中国逻辑学家公孙龙提出的一个逻辑问题“白马非马”。
明白了类和对象的概念,我们来学习Python中如何定义一个类。定义类包含两个部分,一个是属性部分,一个是行为部分。定义类实际上就是描述一个类,抽象出这个类的属性和行为,先来看一个例子。如果我们要定义一个Dog类,如何描述这个小狗呢?小狗有品种、颜色、年龄和名字这类的属性,小狗能叫,能看家,还能啃骨头,就这么多吧。我们如下定义一个小狗类。
class Dog:
def __init__(self,type="Husky",color="white",age=1,name="panther"):
self.type=type
self.age=age
self.color=color
self.age=age
self.name=name
def bark(self):
print("bark ! bark !")
def eat(self):
print("I can gnaw bone,yummy,yummy")
def protect(self):
print("I can look after my house")
def information(self):
print("My name is", self.name)
print("I am",self.age,"years old!")
print("I like", self.color)
self.eat()
self.protect()
self.bark()
def main():
d=Dog(type="Husky",color="white",age=2)
d.information()
main()
运行结果如下:
My name is panther
I am 2 years old!
I like white
I can gnaw bone,yummy,yummy
I can look after my house
bark ! bark !
回去好好看看源代码,我们一句一句的解释一下。
class Dog: #定义Dog类,语法为:class className:
每个类必须有一个初始化方法__init__,用于定义属性(数据域)。类里面的每个方法都有一个self参数,用于创建对象后指向创建的对象本身,其它的参数类似普通函数。在初始化方法__init__中,self.后面的如type、age之类的就是数据域,对应于类的各种属性,如品种、颜色、年龄和名字等。self.type=type的含义就是设置一个属性type,用函数里面的参数type赋值,其它属性类似。
def __init__(self,type="Husky",color="white",age=1,name="panther"):
self.type=type
self.color=color
self.age=age
self.name=name
bark为类里面的方法,这里仅实现功能打印“bark ! bark !”,其它方法类似。
def bark(self):
print("bark ! bark !")
在类的内部,每个方法都可以调用其它方法或者属性,如下面information方法,可以访问类的属性self.name,也可以访问类的方法self.eat()等。
def information(self):
print("My name is", self.name)
print("I am",self.age,"years old!")
print("I like", self.color)
self.eat()
self.protect()
self.bark()
定义好Dog类之后,我们要定义类的对象,在main方法中定义了一个Dog类的对象d=Dog(type="Husky",color="white",age=2),这行代码创建对象后,会自动调用__init__初始化方法设置参数如type,color等。然后通过对象d调用类的方法information ,即d.information()实现输出信息。
总结一下,定义类时要⑴指定类的名字,然后⑵定义初始化方法__init__和其它方法,在初始化方法中通过self加点运算符⑶定义数据域,如self.name。然后定义main函数,在main中⑷定义类的对象调用类的方法。好,试着自己定义一个猫类吧,这样我们的阿猫阿狗就都全了。一步一步来吧。
⑴指定类的名字Cat,定义类: (你的答案写在这儿)参考答案: class Cat:看不见。
⑵定义初始化方法__init__ 和diplay方法
def __init__(self):
def diplay(self): #类似Dog类中的Information显示信息
⑶定义数据域self.age和self.name,把你的代码写在下面
def __init__(self, age=1,name="mimi"):
self.age=age
self.name=name
⑷定义类的对象调用类的方法,把你的代码写在下面
c=Cat()
c.display()
Ok, the end.
完整代码如下:
class Cat:
def __init__(self,age=1,name="mi"):
self.age=age
self.name=name
def display(self):
print("My name is", self.name)
print("I am",self.age,"years old!")
def main():
d=Cat(age=2)
d.display()
main()
运行结果:
My name is mi
I am 2 years old!
再试着定义个圆形类和三角形类,自己设计类的数据域和方法吧,这个没有参考答案呦!
没有,真的没有!
定义好了类,就可以使用构造方法由类来创建对象,构造方法完成2个任务:在内存中为类创建一个对象;调用类的__init__方法来初始化对象。所有方法,包括初始化程序的方法,都有第一个参数self。self 指向调用方法的对象,__init__方法中的self参数被自动地设置为引用刚被创建的对象。
不提供一个参考答案怎么能知道自己做的有多差呢,我说的是我!
import math
class Circle:
# Construct a circle object
def __init__(self, radius=1):
self.radius = radius
def getPerimeter(self):
return 2 * self.radius * math.pi
def getArea(self):
return self.radius * self.radius * math.pi
def setRadius(self, radius):
self.radius = radius
class Triangle:
# Construct a triangle object
def __init__(self, s1=1, s2=1, s3=1):
self.side1 = s1
self.side2 = s2
self.side3 = s3
def getPerimeter(self):
return self.side1+self.side2+self.side3
def getArea(self):
#海伦公式
p=self.getPerimeter()/2
s=math.sqrt(p*(p-self.side1)*(p-self.side2)*(p-self.side3))
return s
def main():
c=Circle(2)
t=Triangle(3,4,5)
print("圆的周长和面积为:",format(c.getPerimeter(),".2f"),format(c.getArea(),".2f"))
print("三角形的周长和面积为:",t.getPerimeter(),t.getArea())
main()