对象与类实例
代码简述
本文代码可能会有点长,但是只有两个重要部分,你只需要掌握这两个部分就可以了,剩下的cat,bird在dog上改动就可以了:
第一个:是创建父类
第二个:子类继承是DOG(小狗的能力)代码创建
掌握这些代码你将获得的宝贝有:
- 类和对象
- 继承
- 构造函数
- 方法重写
- 方法调用
- 输入输出
- 格式化字符串
- 调用父类方法
- 类属性和实例属性
- 类的多态性
第一步首先我们要创建一个父类class Animal:
class Animal:
def __init__(self, name, age):
self.name = name
self.age = age
def eat(self):
print(f"{self.name} is eating")
def make_sound(self):
print("")
def display_info(self):
print(f"Name: {self.name}")
print(f"Age: {self.age}")
现在让我们来解释一下吧:
这段代码定义了一个名为 Animal 的类,用来代表基本的动物特征和行为。这个类是其他特定动物类的基类(或称为父类)。
构造方法 init
def __init__(self, name, age):
self.name = name
self.age = age
- __init__方法是一个特殊方法,用于在创建类的实例时初始化其属性。 这里,__init__方法接受三个参数:self、name 和 age。
- self 是类实例的引用,用于访问类的属性和方法。 name 和 age 是传递给实例的属性,分别代表动物的名称和年龄。
- 在方法内部,self.name = name 和 self.age = age 行将传入的参数 name 和 age 分别赋值给实例的
name 和 age 属性。
方法 eat
def eat(self):
print(f"{self.name} is eating")
- 这是一个实例方法,用于表示动物吃食物的行为。
- 当该方法被调用时,它会打印出一条消息,格式为 “{self.name} is
eating”,其中 {self.name} 会被实例的名字替换。我们在后面子类中会调用进行重写
方法 make_sound
def make_sound(self):
print("")
- 此方法在 Animal 类中没有具体实现(只有一个空的 print 语句)。
- 它的目的是为了被子类覆盖(重写),以提供不同动物的叫声。
- 这是一个多态的示例,即不同的动物类(子类)可以以不同的方式实现相同的方法。
方法 display_info
def display_info(self):
print(f"Name: {self.name}")
print(f"Age: {self.age}")
- 这是一个实例方法,用于打印出动物的信息。
- 当该方法被调用时,它会打印出动物的名字和年龄,分别通过访问self.name 和self.age 属性来获取。
总结
这段代码定义了一个基本的 Animal 类,包含了一些共有的属性(如 name 和 age)和行为(如吃东西和显示信息)。通过继承这个基类,可以创建具有更具体特征和行为的动物子类,如狗、猫或鸟类,这在代码的后续部分中有所体现。这展示了面向对象编程中的继承和多态性质,即如何从一个通用类派生出更具体的类,并通过重写方法来实现特定的功能。
第二步定义Dog子类,用于继承与覆盖父类Animal
构造方法 init
class Dog(Animal):
def __init__(self, name, age, pinzhong, make_sound):
super().__init__(name, age)
self.breed = pinzhong
self.make_sounds = make_sound
- init 方法用于初始化 Dog 类的实例。 除了 name 和 age(这两个从 Animal 类继承而来),此方法还接受两个额外的参数:pinzhong 和 make_sound。 pinzhong 参数用于指定狗的品种。
- make_sound 参数用于指定狗的叫声。 super().init(name, age) 调用了基类(Animal类)的构造方法,用于初始化继承的 name 和 age 属性。
- self.breed = pinzhong 将传入的品种赋值给实例的
breed 属性。 self.make_sounds = make_sound 将传入的叫声赋值给实例的 make_sounds 属性。
方法 eat
def eat(self):
print("狗条")
- 覆盖了基类的 eat 方法,当调用 Dog 实例的 eat 方法时,将打印出 “狗条”,这是一个特定于狗的行为。
方法 make_d
def make_d(self):
return f"{self.make_sounds}"
- 这是 Dog 类特有的一个方法,用于返回实例的叫声(通过访问 self.make_sounds 属性)。
- 注意,这个方法是 Dog类特有的,并且与基类的 make_sound 方法不同(虽然它们的意图相似)。
方法 display_info
def display_info(self):
super().display_info()
print(f"品种: {self.breed}")
print(f"叫声: {self.make_sounds}")
- 覆盖了基类的 display_info 方法,用于打印出狗的信息。 首先,使用 super().display info()
- 调用了基类的方法,打印出动物的名字和年龄。 然后,额外打印出了狗的品种和叫声,这是通过访问 self.breed 和
self.make_sounds 属性实现的。
总结
Dog 类通过继承 Animal 类,并添加或覆盖特定的属性和方法,成功地表示了狗这一动物种类的特有特征和行为。这包括了狗的品种和叫声,以及狗特有的吃食行为。通过这样的设计,展示了面向对象编程中继承的强大功能,即如何基于一个通用类创建更具体的子类,并根据需要对其行为和属性进行定制。
第三步就是在第二篇基础上改变,分别写出cat,bird
class Cat(Animal):
def __init__(self, name, age, colors, make_sound):
super().__init__(name, age)
self.color = colors
self.make_sounds = make_sound
def eat(self):
print("猫条")
def make_d(self):
return f"{self.make_sounds}"
def display_info(self):
super().display_info()
print(f"颜色: {self.color}")
print(f"叫声: {self.make_sounds}")
Cat 类
- Cat 类象征着猫,它同样继承自 Animal 类。
- 这里的不同之处在于猫特有的属性和行为。 构造方法中接收的是 colors 和make_sound 参数,其中 colors 用于表示猫的颜色,这是与 Dog 类中品种(pinzhong)参数的主要区别。
- 在eat 方法中,输出的是 “猫条”,反映了猫的饮食偏好不同于狗。 在 display_info方法中,除了基本信息外,额外显示了猫的颜色(self.color),而不是品种。
class Bird(Animal):
def __init__(self, name, age, can_flys, make_sound):
super().__init__(name, age)
self.can_f = can_flys
self.make_sounds = make_sound
def eat(self):
print("鸟条")
def make_d(self):
return f"{self.make_sounds}"
def display_info(self):
super().display_info()
print(f"能否跳楼: {self.can_f}")
print(f"叫声: {self.make_sounds}")
Bird 类
- Bird 类代表了鸟,它也是从 Animal 类继承而来。主要区别在于它特有的属性和行为,突出了鸟类的独特性。
- 构造方法接受的是can_flys 和 make_sound 参数,can_flys 用于表示鸟是否能飞,这是与 Cat 和 Dog 类的一个显著不同。
- 在 eat 方法中,输出的是 “鸟条”,这再次体现了不同动物的饮食习惯。
- 在 display_info方法中,特别之处在于展示了鸟是否能飞(self.can_f),这是一个针对鸟类特有的属性。
第四步实际应用上述定义的类进行对象的创建和操作
dog = Dog('小黑', 2, '拉布拉多', input("快狗叫~:"))
cat = Cat('布布', 3, '黄色', input("快猫叫~:"))
bird = Bird('苗苗', 18, '起飞', input("快鸟叫~:"))
dog.display_info()
cat.display_info()
bird.display_info()
1.Dog 对象
1.创建了一个名为 dog 的 Dog 类实例,表示一只狗。
2.初始化时传入了四个参数:名字 “小黑”、年龄 2、品种 “拉布拉多” 和一个通过 input 函数获取的狗叫声。
3.调用了 dog 对象的 display_info 方法来输出狗的信息,包括它的名字、年龄、品种和叫声。
2.Cat 对象
1.创建了一个名为 cat 的 Cat 类实例,代表一只猫。
2.初始化时传入了四个参数:名字 “布布”、年龄 3、颜色 “黄色” 和一个通过 input 函数获取的猫叫声。
3.调用了 cat 对象的 display_info 方法来输出猫的信息,显示它的名字、年龄、颜色和叫声。
3.Bird 对象
1.创建了一个名为 bird 的 Bird 类实例,表示一只鸟。
2.初始化时传入了四个参数:名字 “苗苗”、年龄 18、是否能飞(在这里用 “起飞” 来表示鸟的飞行能力,虽然这个表述在现实中可能不太准确)和一个通过 input 函数获取的鸟叫声。
3.调用了 bird 对象的 display_info 方法来输出鸟的信息,包括它的名字、年龄、是否能飞和叫声。
总结
这段代码展示了如何结合面向对象的特性(如封装和继承)和用户交互来创建和操作具有不同属性和行为的对象,进一步强调了面向对象编程在处理复杂数据结构时的灵活性和强大功能。
作者结语:
哈哈恭喜你们又学到了很多有用的知识,可爱的你们能够给辛苦了2小时的作者留下关注和小心心吗,希望可以和你们共同进步
完整代码
class Animal:
def __init__(self, name, age):
self.name = name
self.age = age
def eat(self):
print(f"{self.name} is eating")
def make_sound(self):
print("")
def display_info(self):
print(f"Name: {self.name}")
print(f"Age: {self.age}")
class Dog(Animal):
def __init__(self, name, age, pinzhong, make_sound):
super().__init__(name, age)
self.breed = pinzhong
self.make_sounds = make_sound
def eat(self):
print("狗条")
def make_d(self):
return f"{self.make_sounds}"
def display_info(self):
super().display_info()
print(f"品种: {self.breed}")
print(f"叫声: {self.make_sounds}")
class Cat(Animal):
def __init__(self, name, age, colors, make_sound):
super().__init__(name, age)
self.color = colors
self.make_sounds = make_sound
def eat(self):
print("猫条")
def make_d(self):
return f"{self.make_sounds}"
def display_info(self):
super().display_info()
print(f"颜色: {self.color}")
print(f"叫声: {self.make_sounds}")
class Bird(Animal):
def __init__(self, name, age, can_flys, make_sound):
super().__init__(name, age)
self.can_f = can_flys
self.make_sounds = make_sound
def eat(self):
print("鸟条")
def make_d(self):
return f"{self.make_sounds}"
def display_info(self):
super().display_info()
print(f"能否跳楼: {self.can_f}")
print(f"叫声: {self.make_sounds}")
dog = Dog('小黑', 2, '拉布拉多', input("快狗叫~:"))
cat = Cat('布布', 3, '黄色', input("快猫叫~:"))
bird = Bird('苗苗', 18, '起飞', input("快鸟叫~:"))
dog.display_info()
cat.display_info()
bird.display_info()