一、面向对象的概念
面向过程:
面向对象是相对于面向过程来说的,面向过程是一种以“过程”为中心的编程思想,分析出解决问题所需的步骤,然后用函数将这些步骤一步步的实现,使用的时候再一个个依次调用就好。
面向对象:
而面向对象是一种以“对象”为中心的编程思想,把问题看出一个个对象,通过对象的属性和行为,将问题解决的。
举例说明两者之间的关系:
面向过程就是和面、揉面、擀面、切面、烧水、下面、盛面、吃面。
面向对象就是先造面,再造人,为人赋予和面、下面、烧水的一系列行为和动作。模拟人类认知世界的能力,收集信息----通过大脑分析抽象----建模----分门别类的一个过程。
二、类的概念
类就是一类事物的统称。
面向对象是以“对象”为基本单元构建系统,对象是把数据和数据操作方法放在一起,作为一个相互依存的整体。把同类的对象抽象出其共性,形成类。所以说,类是对象的抽象,对象是类具体化的体现(类是大范围的,一个类可以有多个对象)。
面向对象的编程就要先造个类,类分为静态与动态。举个例子来说就是一只猫的颜色、体重、肤色、皮毛、年龄为它的静态特征,她的行为就为动态,需要用函数来体现。
三、定义类的方法
#在python中,定义类使用关键字是class
#python的中类名称定义规则和其他编程语言一致,遵循的是大驼峰法
#大驼峰法:所有单词的首字母都大写
class User: <=> class User(object):
#这两种写法在Python3中一致,左边的写法等于右边的写法
#也就是Python默认定义的任何类都是object类的子类
1. 类的静态特征的定义:
class User(object):#class 类名称(object):
#重写方法 __init__(对象初始化函数)
#self这个参数必须存在,否则不认为类
#代表的是对象本身,类似于Java里的this关键字
def __inint__(self):
#init初始化函数中,定义类的静态特征
self.username = "JAY" #self.属性名称 = 属性值
self.age = 41
self.gender = "男"
self.email = "JAT@qq.com"
self.telephone = "233333"
u = User() #此时u这个变量指的就是User这个类所得的对象
#Python中获取对象:
#对象名称 = 类名称() #初始化对象,构建对象
print(u)
结果为:<__main__.User object at 0x00000257373EB7F0>
print(u.username)
结果为:jay
#可以在构建完成后,修改对象的属性值
u = User()
u.username = "EDC"
print(u.username)
结果为:EDC
class Dog(object):
def __init__(self, name, color, age, type):
#self.xxx指的是类的静态属性
self.name = name
self.color = color
self.age = age
self.type = type
#创建对象
dog1 = Dog("大黄", "黄色", 3, "京巴")
print(dog1.name)
print(dog1.color)
print(dog1.type)
#对象的属性,应该是在对象创建的时候,初始化出来
结果为:
大黄
黄色
京巴
2. 类的动态特征的定义:
3. 类的属性的定义:
4. 类的方法的定义:
5. 通过类来初始化对象:
6. 对象的方法的调用:
7. 对象的属性的调用:
class Cat(object):
def __init__(object, name, gender, color, age, type):
self.name = name
self.age = age
self.color = color
self.type = type
self.gender = gender
#猫不仅有静态属性,它还有自己的动作
#一般使用一个函数来描述类的一个动态行为
def speak(self):
print("我是喵星人")
print("我的名字叫{},我是{}猫".format(self.name,self.gender))
#行为动作
#这里不需要传,因为self绑定的东西是类的,将来得到的对象是属于对象的,而这个方法也是属于对象的
#在类的方法中,可以直接访问到类的任何属性和方法!
#方法可以有参数
def eat(self, food):
print("本喵在吃饭,请不要打扰我!")
print("食物是:{}.format(food))"
#也可以有返回值
def add(self, x, y):
return x + y
mimi = Cat("狗", "母", "棕", 6, "波斯猫")
#调用猫的speak方法
mimi.speak() #有参就传参
mimi.eat("精品猫粮") #没参就不要传参
res = mimi.add(10, 20) #有返回值请接收它
print(res)
结果为:
我是喵星人
我的名字叫狗,我是母猫
四、魔法方法
mimi = Cat("狗", "母", "棕", 6, "波斯猫")
#调用猫的speak方法
mimi.speak() #有参就传参
mimi.eat("精品猫粮") #没参就不要传参
res = mimi.add(10, 20) #有返回值请接收它
print(res)
mimi.gender = "公"
mimi.name = "猫"
print(mimi.gender + mimi.name)
如果需要修改打印值,这样的输出方法随着输出内容的增多会变得十分繁琐,于是我们可以使用Python默认的魔法方法。
def __str__(self):
"""这是一个默认的魔法方法,有特殊含义"""
"""快速在控制台上查看对象的属性"""
return "【 name="+ self.name +", age="+ str(self.age) +", gender="+ self.gender +"】"
mimi = Cat("狗", "母", "棕", 6, "波斯猫")
#调用猫的speak方法
mimi.speak() #有参就传参
mimi.eat("精品猫粮") #没参就不要传参
res = mimi.add(10, 20) #有返回值请接收它
print(res)
mimi.gender = "公"
mimi.name = "小疙瘩"
print(mimi)
五、面向对象的简单案例
使用面向对象来求圆的面积与周长:
import math
class Circle(object):
def __init__(self, r):
self.r = r
def get_area(self):
return math.pi * self.r * self.r
def get_cal(self):
return math.pi * self.r * 2
if __name__ == '__main__':
# main 作测试的,这里面的代码不会导入到其他模块中
r = float(input("请输入圆的半径:"))
c1 = Circle(r)
area = c1.get_area()
cal = c1.get_cal()
print("半径为{}的圆的周长是{},面积是{}".format(r, cal, area))