面向对象编程是一种编程范式,它将程序中的数据和操作封装在一个对象中,通过调用对象的方法来实现对数据的操作。在Python中,类是一种用户自定义的数据类型,它可以用来创建对象。对象是类的实例,它包含了数据和方法。
2、类的定义和实例化在Python中,可以使用class关键字来定义类,类名习惯以大写字母开头。类包含了属性和方法,属性是类的数据成员,方法是类的函数成员。在类中,可以使用self关键字来引用当前对象的属性和方法。
class MyClass: def __init__(self, name): self.name = name def say_hello(self): print("Hello, " + self.name + "!")# 实例化对象obj = MyClass("world")# 调用对象的方法obj.say_hello() # 输出:Hello, world!
3、对象的属性和方法对象的属性是指对象所包含的数据成员,对象的方法是指对象所包含的函数成员。在Python中,对象的属性和方法可以通过点号(.)来访问。
【资料图】
class MyClass: def __init__(self, name): self.name = name def say_hello(self): print("Hello, " + self.name + "!")# 实例化对象obj = MyClass("world")# 访问对象的属性和方法print(obj.name) # 输出:worldobj.say_hello() # 输出:Hello, world!
二、继承和多态1、继承的概念和实现继承是指一个类可以获得另一个类的属性和方法,从而避免重复编写代码,提高代码的复用性和扩展性。在Python中,可以使用class关键字来定义继承关系,使用super()函数来调用父类的方法。
class Animal: def __init__(self, name): self.name = name def eat(self): print(self.name + " is eating.")class Cat(Animal): def __init__(self, name, color): super().__init__(name) self.color = color def meow(self): print(self.name + " is meowing.")# 实例化对象cat = Cat("Tom", "white")# 调用对象的属性和方法print(cat.name) # 输出:Tomprint(cat.color) # 输出:whitecat.eat() # 输出:Tom is eating.cat.meow() # 输出:Tom is meowing.
2、多态的概念和实现多态是指同一种类型的对象,调用同一个方法可以产生不同的结果。在Python中,多态可以通过方法的重写和方法的重载来实现。
方法的重写是指子类重新定义父类中已有的方法,从而实现对方法的覆盖。
class Animal: def __init__(self, name): self.name = name def eat(self): print(self.name + " is eating.")class Cat(Animal): def __init__(self, name, color): super().__init__(name) self.color = color def eat(self): print(self.name + " is eating fish.")# 实例化对象cat = Cat("Tom", "white")# 调用对象的方法cat.eat() # 输出:Tom is eating fish.
方法的重载是指在一个类中定义多个同名的方法,但是这些方法的参数类型和个数不同,从而实现对方法的扩展。
class MyClass: def my_method(self): print("my_method() without parameter") def my_method(self, x): print("my_method() with parameter: " + str(x))# 实例化对象obj = MyClass()# 调用对象的方法obj.my_method() # 报错:TypeError: my_method() missing 1 required positional argument: "x"obj.my_method(123) # 输出:my_method() with parameter: 123
三、抽象类和接口1、抽象类的定义和实现抽象类是指不能被实例化的类,它只能作为其他类的父类,用于定义抽象方法和属性。在Python中,可以使用abc模块来定义抽象类,使用@abstractmethod装饰器来定义抽象方法和属性。
from abc import ABC, abstractmethodclass Animal(ABC): @abstractmethod def eat(self): passclass Cat(Animal): def eat(self): print("Cat is eating fish.")# 实例化对象cat = Cat()# 调用对象的方法cat.eat() # 输出:Cat is eating fish.
2、接口的定义和实现接口是指一组抽象方法和属性的集合,用于描述类所提供的服务。在Python中,接口并没有严格的定义,一般使用抽象类来实现接口的功能。
from abc import ABC, abstractmethodclass IAnimal(ABC): @abstractmethod def eat(self): passclass Cat(IAnimal): def eat(self): print("Cat is eating fish.")# 实例化对象cat = Cat()# 调用对象的方法cat.eat() # 输出:Cat is eating fish.
四、特殊方法1、 __init__方法__init__方法是指类的构造方法,它在类实例化时自动调用,用于初始化对象的属性。在Python中,可以使用__init__方法来定义类的构造方法。
class MyClass: def __init__(self, name): self.name = name# 实例化对象obj = MyClass("world")# 访问对象的属性print(obj.name) # 输出:world
2、__str__方法__str__方法是指类的字符串表示方法,它可以将类对象转换为字符串类型,用于打印对象时的输出。在Python中,可以使用__str__方法来定义类的字符串表示方法。
class MyClass: def __init__(self, name): self.name = name def __str__(self): return "MyClass(name=" + self.name + ")"# 实例化对象obj = MyClass("world")# 打印对象print(obj) # 输出:MyClass(name=world)
3、其他常用的特殊方法在Python中,还有许多其他常用的特殊方法,如__eq__方法用于判断两个对象是否相等,__lt__方法用于判断一个对象是否小于另一个对象,__len__方法用于获取对象的长度等。
五、访问控制1、公有、私有和保护成员在Python中,可以使用下划线(_)来定义公有、私有和保护成员。公有成员是指可以被任何对象访问的成员,私有成员是指只能被类内部访问的成员,保护成员是指只能被类内部和子类访问的成员。
class MyClass: def __init__(self, name, age): self.name = name # 公有成员 self._age = age # 保护成员 self.__gender = "male" # 私有成员 def say_hello(self): print("Hello, " + self.name + "!") def get_gender(self): return self.__gender# 实例化对象obj = MyClass("Tom", 18)# 访问对象的属性和方法print(obj.name) # 输出:Tomprint(obj._age) # 输出:18print(obj.get_gender()) # 输出:maleprint(obj.__gender) # 报错:AttributeError: "MyClass" object has no attribute "__gender"
2、访问控制的实现方式在Python中,访问控制并不是强制性的,只是一种约定俗成的规范。如果希望强制实现访问控制,可以使用属性装饰器@property、@属性名.setter和@属性名.deleter来限制属性的访问。
class MyClass: def __init__(self, name, age): self.name = name self._age = age @property def age(self): return self._age @age.setter def age(self, value): if value < 0: raise ValueError("Age cannot be negative.") self._age = value @age.deleter def age(self): del self._age# 实例化对象obj = MyClass("Tom", 18)# 访问对象的属性print(obj.name) # 输出:Tomprint(obj.age) # 输出:18# 修改对象的属性obj.age = 20print(obj.age) # 输出:20# 删除对象的属性del obj.ageprint(obj.age) # 报错:AttributeError: "MyClass" object has no attribute "_age"
六、代码示例下面是一个完整的示例代码,包括类和对象的定义和使用、继承和多态的实现、抽象类和接口的定义和实现、特殊方法和访问控制的实现。
from abc import ABC, abstractmethod# 定义动物类class Animal(ABC): def __init__(self, name): self.name = name @abstractmethod def eat(self): pass# 定义猫类class Cat(Animal): def __init__(self, name, color): super().__init__(name) self.color = color def eat(self): print(self.name + " is eating fish.") def __str__(self): return "Cat(name=" + self.name + ", color=" + self.color + ")"# 定义狗类class Dog(Animal): def __init__(self, name, breed): super().__init__(name) self.breed = breed def eat(self): print(self.name + " is eating meat.") def __str__(self): return "Dog(name=" + self.name + ", breed=" + self.breed + ")"# 定义接口类class IShout(ABC): @abstractmethod def shout(self): pass# 定义黄狗类class YellowDog(Dog, IShout): def __init__(self, name, breed): super().__init__(name, breed) def shout(self): print(self.name + " is shouting: Wow, wow!") def __str__(self): return "YellowDog(name=" + self.name + ", breed=" + self.breed + ")"# 实例化对象cat = Cat("Tom", "white")dog = Dog("Spike", "bulldog")yellow_dog = YellowDog("Charlie", "golden retriever")# 调用方法cat.eat() # 输出:Tom is eating fish.dog.eat() # 输出:Spike is eating meat.yellow_dog.eat() # 输出:Charlie is eating meat.yellow_dog.shout() # 输出:Charlie is shouting: Wow, wow!# 输出对象的字符串表示print(cat) # 输出:Cat(name=Tom, color=white)print(dog) # 输出:Dog(name=Spike, breed=bulldog)print(yellow_dog) # 输出:YellowDog(name=Charlie, breed=golden retriever)
Copyright @ 2015-2022 中国IT产业网版权所有 备案号: 沪ICP备2022005074号-4 联系邮箱:58 55 97 3@qq.com