文章目录
- 00 | 😃为什么学习类?😃
- 01 | 😄创建类😄
- 02 | 😆创建对象😆
- 03 | 😉访问对象属性和方法😉
- 04 | 😊构造函数😊
- 05 | 😋继承😋
- 06 | 🤗习题🤗
- 07 | 😙问题😙
If a thing is worth doing it is worth doing well.
如果事情值得做,就值得做好。
00 | 😃为什么学习类?😃
Python中的所有数据都可以视为对象,并且每个对象都属于一个特定的类别,这些类别定义了对象的属性和方法。通过使用类,您可以创建自己的对象,并在这些对象上执行操作。类也提供了一种有效的封装数据和行为的方式,从而使代码更加模块化、可重用和易于维护。此外,面向对象编程也是大多数现代编程语言所共有的基本概念之一,因此学习类将帮助更好地理解其他编程语言。
在Python中,类和对象是重要的编程概念。类是一个模板,它定义了一组属性或方法,而对象则是该类的实例。以下是关于Python类和对象的详细讲解:
01 | 😄创建类😄
要创建一个类,需要使用class关键字,后跟类名和冒号。在类内部,可以定义属性和方法。示例:
class MyClass:
x = 5
def my_method(self):
print("Hello, World!")
上面的代码将定义一个名为MyClass的类。它有一个属性x等于5,以及一个名为my_method的方法,它将打印“Hello, World!”。
02 | 😆创建对象😆
要创建类的对象,只需调用类并将返回的对象分配给变量。例如,以下代码将创建一个名为obj的MyClass对象:
obj = MyClass()
03 | 😉访问对象属性和方法😉
要访问对象的属性和方法,需要使用点表示法。例如,在上面的示例中,要访问MyClass的属性x,执行以下操作:
print(obj.x)
要调用对象的方法,执行以下操作:
obj.my_method()
04 | 😊构造函数😊
当创建新的对象时,Python将自动调用名为__init __()的构造函数。可以在构造函数中初始化对象的属性。示例:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
person = Person("Alice", 20)
print(person.name) # 输出“Alice”
print(person.age) # 输出“20”
上述代码将定义一个名为Person的类,并在构造函数中初始化对象的两个属性:name和age。然后,它将创建一个具有名称“Alice”和年龄20的Person对象,并输出其名称和年龄。
05 | 😋继承😋
为什么学习继承?当然是可以偷懒啊(不是)
继承可以使得子类具有父类的各种属性和方法,而不需要再次编写相同的代码(偷懒)。
在Python中,可以使用继承从现有类派生新类。使用继承,可以重用现有类的代码,并添加新功能以满足特定的需求。示例:
class Animal:
def __init__(self, name):
self.name = name
def sound(self):
pass
class Dog(Animal):
def sound(self):
return "Woof!"
class Cat(Animal):
def sound(self):
return "Meow!"
dog = Dog("Rover")
cat = Cat("Fluffy")
print(dog.sound()) # 输出“Woof!”
print(cat.sound()) # 输出“Meow!”
上面的代码将定义一个名为Animal的基本类,该类包含属性name和方法sound。然后,它将定义两个类Dog和Cat,这些类将从Animal类继承。它们还将覆盖sound()方法以提供特定于狗和猫的声音。最后,它将创建一个名为Rover的狗对象和一个名为Fluffy的猫对象,并调用他们各自的sound()方法。
总之,在Python中,类和对象是一种重要的编程概念。通过学习如何创建类、创建对象、访问对象属性和方法、编写构造函数以及使用继承,能更好地设计和编写面向对象的Python程序。
06 | 🤗习题🤗
-
定义一个动物大类,包含一些共同属性和方法,再定义两个猫类和狗类,使它们具有各自的方法
class Animal(object): # 定义父类animal def __init__(self,name,sound): # 初始化属性 name sound self.name = name self.sound = sound self.talk() # 一实例化即调用talk()方法 def talk(self): # 定义父类方法,用于打招呼 print("I am %s,%s" % (self.name,self.sound)) class Dog(Animal): # 继承父类animal def jump(self): # 增加子类新方法 print("I eat gouliang!") class Cat(Animal): # 继承父类animal def sleep(self): # 增加子类新方法 print("I eat maoliang") catt = Cat("cat","miao~miao~miao") # 实例化cat类,得到catt对象 catt.sleep() # 调用对象方法 dogg = Dog("dog","wang~wang~wang") dogg.jump()
输出结果如下:
-
定义一个点(Point)类和直线(Line)类,使用getLen的方法可以获得直线的长度
-
Python中计算开根号可以使用math模块中的sqrt函数
-
直线需有两点构成,因此初始化时需要有两个点(Point)对象作为参数。
import math class Point(): def __init__(self,x=0,y=0): self.x = x self.y = y def getX(self): return self.x def getY(self): return self.y class Line(): def __init__(self,p1,p2): self.x = p1.getX() - p2.getX() self.y = p1.getY() - p2.getY() self.len = math.sqrt(self.x*self.x + self.y*self.y) def getLen(self): return self.len p1 = Point(1,1) p2 = Point(4,5) line = Line(p1,p2) print(line.getLen())
结果输出为:5
-
07 | 😙问题😙
-
能否重写 __init__函数的返回值?会有什么问题?
class Animal(object): def __init__(self,name,sound): return 'This is animal'
以上重写 __init__函数的方法是不允许的。因为**__init__特殊方法不应当返回除了None以外的任何对象**
可以看下执行结果如下
-
习题中的第一题,如果那只狗不会叫的话,怎么屏蔽父类中的
talk()
方法?覆盖父类方法,例如将函数体内容写pass
class Animal(object): # 定义父类animal def __init__(self,name,sound): # 初始化属性 name sound self.name = name self.sound = sound self.talk() # 一实例化即调用talk()方法 def talk(self): # 定义父类方法,用于打招呼 print("I am %s,%s" % (self.name,self.sound)) class Dog(Animal): # 继承父类animal def jump(self): # 增加子类新方法 print("I eat gouliang!") class Cat(Animal): # 继承父类animal def talk(self): pass def sleep(self): # 增加子类新方法 print("I eat maoliang") catt = Cat("cat","miao~miao~miao") # 实例化cat类,得到catt对象 catt.sleep() # 调用对象方法 dogg = Dog("dog","wang~wang~wang") dogg.jump()