Python面向对象
类和对象
class Person:def __init__(self,name,age):self.name=name #类的成员属性self.age=ageprint("构造函数")def get_name(self):print(self.name)def get_age(self):print(self.age)p =Person("张三",18)
p.get_name()
p.get_age()
打印结果:
构造函数
张三
18
成员方法都会默认有参数self
,调用的时候不需要传递self
特殊方法和参数
__init__
方法
__init__
是一个内置的方法
当对象创建的时候就会自动执行__init__
方法
# 定义类
class Person:def __init__(self):print('执行了init方法')# 创建对象
p1 = Person()
p2 = Person()
输出:
执行了init方法
执行了init方法
一旦创建了该类的对象就会执行__init__
方法
__str__
方法
类似于Java中的toString()方法__str__
也是类的内置方法
class Person:def __init__(self,name,age):self.name=name #成员属性self.age=ageprint("构造函数")def __str__(self):return "name={},age={}".format(self.name,self.age)def get_name(self):print(self.name)def get_age(self):print(self.age)p =Person("张三",18)print(p)
name=张三,age=18
私有化
将属性或者方法设置为不能在外部访问,就是私有化
私有化包括:属性私有化、方法私有化
属性私有化
属性私有化格式,注意是两个下划线__
self.__属性名 = 属性值
class Circle:def __init__(self,radius):# 半径self.radius = radius# 私有化圆周率属性 self.__PI = 3.1415926def perimeter(self):'''求圆的周长:return: 圆的周长'''return 2 * self.__PI * self.radius
私有化作用:保证类中数据安全
方法私有化
方法的私有化方式和属性私有化方式一样
class Person:def __say_hello(self):print('hello')
继承
继承指的是一个对象直接使用另一个对象的属性或方法
继承的格式:class 子类名(父类名):
class Person:def __init__(self,name,age):self.name=name #成员属性self.age=ageprint("构造函数")def __str__(self):return "name={},age={}".format(self.name,self.age)def get_name(self):print(self.name)def get_age(self):print(self.age)def eat(self):print(f"{self.name}吃饭")#学生类继承Person
class Student(Person):def __init__(self,name,age,height):super().__init__(name,age)self.height=height #定义自己的属性heights=Student("张三",18,180)
s.eat()
输出结果:
张三吃饭
多继承
当一个类从多个父类继承属性和方法时,就称为多继承。
多继承格式:class 子类(父类1,父类2...)
class Animal:def __init__(self, name):self.name = namedef eat(self):print(f"{self.name} is eating.")def sleep(self):print(f"{self.name} is sleeping.")class Flyable:def fly(self):print(f"{self.name} is flying.")class Swimmable:def swim(self):print(f"{self.name} is swimming.")class Duck(Animal, Flyable, Swimmable):def __init__(self, name):super().__init__(name)duck = Duck("Donald")
duck.eat() # 输出: Donald is eating.
duck.sleep() # 输出: Donald is sleeping.
duck.fly() # 输出: Donald is flying.
duck.swim() # 输出: Donald is swimming.
注意,在多继承的情况下,当多个父类中具有相同名称的方法时,解释器将按照方法解析顺序(Method Resolution Order,MRO)来确定使用哪个方法。在上述示例中,Python的默认MRO算法会按照类定义时的顺序来解析方法。在这个例子中,Duck
类首先从Animal
类继承方法,然后是Flyable
类,最后是Swimmable
类(按照括号的顺序从前往后)。
多态
"""
多态案例
"""
# 父类
class Human:def eat(self):print('人类吃饭')# 中国人
class ZhHuman(Human):def eat(self):print('中国人使用筷子吃饭')# 美国人
class UsHuman(Human):def eat(self):print('美国人使用刀叉吃饭')# 非洲人
class AfricaHuman(Human):def eat(self):print('非洲人直接用手吃恩希玛')# 函数
def someone_eat(someone):'''接收一个具备吃eat功能的对象'''someone.eat()# 创建四个对象
human = Human()
zh_human = ZhHuman()
us_human = UsHuman()
africa_huamn = AfricaHuman()# 调用translate方法
someone_eat(human)
someone_eat(zh_human)
someone_eat(us_human)
someone_eat(africa_huamn)
鸭子类型
一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟可以被称为鸭子。这就是鸭子类型Duck Typing
对于上述多态中的的someone_eat
class Dog:def eat(self):print('狗吃骨头')# 函数
def someone_eat(someone):'''接收一个具备吃eat功能的对象'''someone.eat()dog = Dog()
someone_eat(dog)
someone_eat
需要传递一个具备eat
方法的对象,但是Dog
也具备eat
功能,所以也可以传递运行
这是由于python是动态类型语言,不能像C++、Java等静态类型语言一样,限制传递的数据类型
只要运行时发现dog对象有这个功能,就可以在函数中使