面向对象
第一个实战演练
# 需求:小猫爱吃鱼,小猫要喝水
# 定义一个猫类(Cat),定义两个方法(eat 和 drink)
# 类的命名需要大驼峰命名
class Cat:
def eat(self):
print("小猫爱吃鱼")
def drink(self):
print("小猫要喝水")
# 创建对象
tom = Cat()
tom.eat()
tom.drink()
print(tom) # 可以看出变量引用的对象是哪一个类创建的对象,以及内存中的地址(十六进制表示),%d以10进制输出数字,%x是以16进制输出
==类只有一个,但可以用类创建不同的对象
==
class Cat:
def eat(self):
print("小猫爱吃鱼")
def drink(self):
print("小猫要喝水")
# 创建对象
tom = Cat()
tom.eat()
tom.drink()
print(tom)
# 再创建一个猫对象
lazy_cat = Cat()
lazy_cat.eat()
lazy_cat.drink()
print(lazy_cat)
输出为
设置对象属性
class Cat:
def eat(self):
# 哪一个对象调用的方法,self就是哪一个对象的引用
print("%s 爱吃鱼" % self.name)
def drink(self):
print("%s 要喝水" % self.name)
# 创建对象
tom = Cat()
# 可以使用 .属性名 利用赋值语句就可以了
# tom.name = "Tom" 不推荐在类的外部创建属性
tom.eat()
tom.drink()
print(tom)
# 再创建一个猫对象
lazy_cat = Cat()
# lazy_cat.name = "大懒猫"
lazy_cat.eat()
lazy_cat.drink()
print(lazy_cat)
输出为
在初始化方法内部定义对象的属性
class Cat:
def __init__(self):
print("这是一个初始化方法")
# self.属性名 = 属性的初始值
self.name = "Tom"
def eat(self):
print("%s 爱吃鱼" % self.name)
# 使用类名()创建对象的时候,会自动调用初始化方法__init__
tom = Cat()
tom.eat()
print(tom.name)
输出为
但是上述方法会把name属性固定死,应该在函数内部加上形参使函数变得灵活
class Cat:
def __init__(self,new_name):
print("这是一个初始化方法")
# self.属性名 = 属性的初始值
# self.name = "Tom"
self.name = new_name
def eat(self):
print("%s 爱吃鱼" % self.name)
# 使用类名()创建对象的时候,会自动调用初始化方法__init__
tom = Cat("Tom")
tom.eat()
print(tom.name)
lazy_cat = Cat("大懒猫")
lazy_cat.eat()
str 函数
class Cat:
def __init__(self,new_name):
self.name = new_name
print("%s 来了" % self.name)
def __del__(self):
# 是变量生命周期结束前执行的最后一个函数
print("%s 去了" % self.name)
def __str__(self):
# 必须返回一个字符串
return "我是小猫[%s]" % self.name
# Tom是一个全局变量
tom = Cat("Tom")
print(tom)
输出为