面向对象vs面向过程
面向对象: 把事情交给对象去处理
v面向过程: 一步一步完成
类和对象
对象:用来描述客观事物的一个实体,由一组属性和方法构成
类: 是抽象的概念,仅仅是模板
类是对象的模板, 对象是类的具体实例
类来创建对象被称为实例化。
class 类名():
# 属性
# 函数, 但是第一个参数必须是self
def show(self):
pass
举个栗子
# class 类名():
# # 属性
#
# # 函数, 但是第一个参数必须是self
# def show(self):
# pass
# 定义类
class Dog():
def __init__(self):
self.name = None
self.color = None
def show(self):
print(f"狗狗的名字是{ self.name}, 颜色是{self.color}")
def eat(self):
print(f"狗狗{self.name}吃的嘎嘎香")
# 调用类
# 对象名 = 类名()
# 调用函数 对象名.函数名
dog1 = Dog()
# 属性赋值
dog1.name = "豆豆"
dog1.color = "白色"
dog1.show()
dog1.eat()
self 是什么
哪个对象在调用, self就是谁
class Dog():
def __init__(self):
self.name = None
self.color = None
def show(self):
print(f"狗狗的名字是{ self.name}, 颜色是{self.color}, self的地址={id(self)}")
dog1 = Dog()
print("id(dog1) = ", id(dog1))
dog1.name = "豆豆"
dog1.color = "白色"
dog1.show()
dog2 = Dog()
print("id(dog2) = ", id(dog2))
dog2.name = "花花"
dog2.color = "白色"
dog2.show()
__init__函数
也叫做构造函数, __函数名__是具有特殊含义的函数, 也叫魔法方法
__init__函数作用是初始化对象的属性, 在类被实例化时会自动调用
def __init__(self):
print("__init__被调用")
self.name = None
self.color = None
创建对象的同时进行初始化
class Dog():
def __init__(self, name, color, age=0):
print("__init__被调用")
self.name = name
self.color = color
self.age = age
def show(self):
print(f"狗狗的名字是{ self.name}, 颜色是{self.color}, 年龄{self.age}")
d1 = Dog("豆豆","白色")
d1.show()
d2 = Dog("花花","白色", 6)
d2.show()
__str__函数
class Dog():
def __init__(self, name, color, age=0):
self.name = name
self.color = color
self.age = age
def __str__(self):
return f"狗狗的名字是{ self.name}, 颜色是{self.color}, 年龄{self.age}"
d1 = Dog("豆豆","白色")
print(d1)
d2 = Dog("花花","白色", 6)
print(d2)
面向对象三大特性: 封装/继承/多态
私有属性—封装
class Person():
def __init__(self, name, age):
self.name = name
# 属性私有
self.__age = age
def show(self):
self.__age += 1
print(f'姓名:{self.name}., 年龄: {self.__age}')
## 标准的属性访问方法
def getAge(self):
return self.__age
## 标准的修改方法
def setAge(self, age):
self.__age = age
p1 = Person("Eric", 18)
print(p1.name)
p1.setAge(30)
# 私有属性封装, 我们有的时候希望某些属性直供类内部使用, 不希望外部访问
# print(p1.__age) # AttributeError: 'Person' object has no attribute '__age'
p1.show()
print(p1.getAge())
私有函数—封装
class Person():
def __init__(self, name, age):
self.name = name
# 属性私有
self.__age = age
def show(self):
self.__age += 1
print(f'姓名:{self.name}., 年龄: {self.__age}')
print(f'password = {self.__genPassword()}')
## 标准的属性访问方法
def getAge(self):
return self.__age
## 标准的修改方法
def setAge(self, age):
self.__age = age
def __genPassword(self):
return "123456"
p1 = Person("Eric", 18)
print(p1.name)
p1.setAge(30)
# 私有属性封装, 我们有的时候希望某些属性直供类内部使用, 不希望外部访问
# print(p1.__age) # AttributeError: 'Person' object has no attribute '__age'
p1.show()
# p1.__genPassword() 访问不到
print(p1.getAge())