1、Python 的面向对象编程
类的定义和使用
class ClassName: statement ClassName(parameterlist)
- ClassName:类名(驼峰命名法)
- statement:类体,由类变量、方法、属性(如果没有考虑好这个类,可以使用 pass 语句占位
- parameterlist:参数列表,是可选列表(如果没有创建 __init__ 方法或该方法中只有一个 self 参数是,可以省略 parameterlist )
class Dog: pass papi = Dog() print(papi) print(type(papi))
构造方法
构造方法是 __init__() ,init 前后是两个连续的短下划线
__init__() 方法必须包含一个名为 self 的参数,而且必须是构造方法的第一个参数
class Dog: def __init__(self): print('aaa') papi = Dog()
如果没有指定 self 参数,程序运行会出错
属性和方法
1、__init__ 中其他参数必须使用 ”self.属性名“ 的形式赋值
调用时通过 “对象.属性名” 调用class Dog: def __init__(self, name): self.name = name dog1 = Dog('Papi')
2、在类中定义的函数就是方法(成员函数),但是第一个参数必须是 self
class Dog: def __init__(self, name): self.name = name def speak(self, sound): print(sound) dog1 = Dog('Papi') dog1.speak('wolf!')
访问限制
1、在属性前面添加双下划线表示私有成员,只能通过 ”类的实例名._类名__xxx” 的形式访问
class Dog: def __init__(self, name): self.__name = name def run(self): print(self.__name) dog1 = Dog('Papi') dog1.run() print(dog1._Dog__name)
直接通过对象名调用私有属性会出现 AttributeError 错误
2、私有方法同私有属性一样,只能通过类内部调用
class Dog: def __speak(self, sound): print(sound) def run(self): self.__speak('Wolf!') dog1 = Dog() dog1.run()
2、面向对象编程的特性
封装
1、你通过 set 和 get 方法分别进行 赋值 和 取值 操作
class Dog: def __init__(self, name): self.__name = name def get_name(self): return self.__name def set_name(self, name): self.__name = name dog1 = Dog('Papi') dog1.set_name('Honny')
2、在类中通过两个修饰器对属性进行修饰
class Dog: def __init__(self, name): self.__name = name @property # 装饰器 def name(self): # 相当于 get() 方法 return self.__name @name.setter # 装饰器 def name(self, name): # 相当于 set() 方法 self.__name = name dog1 = Dog('Papi') dog1.name = 'Honny' # 在外部可以通过 ”对象名.属性名" 的方式获取年龄
装饰器是修改其他函数功能的函数
- @property:可以是函数变成普通变量那样使用,对要读取的数据进行预处理
- @*.setter:对要存入的数据进行预处理;设置可读属性
@*.setter 装饰器必须在 @property 装饰器后面,两个被修饰函数的函数名必须保持一致
继承
1、定义类时,在类名的右侧使用小括号 () 将父类括起来
class ClassName(baseclasslist): statement
- ClassName:子类的名称
- baseclasslist:要继承的父类(或基类)
- statement:类体
class Animal: def __init__(self): self.name = name def feature(self): return self.name def move(self): print('AAA') class Dog(Animal): pass dog1 = Dog('Papi') dog1.move() print(dog1.feature)
2、如果想调用父类中的构造方法,需要在子类中指定 super() 函数进行调用
class Animal: def __init__(self): self.name = name def feature(self): return self.name def move(self): print('AAA') class Dog(Animal): def __init__(self): super(Dog, self).__init__('Papi') dog1 = Dog() dog1.move() print(dog1.feature)
3、如果子类继承了多个父类,且多个父类中有相同的方法和变量,那么子类的继承顺序是从左到右,并且循环
class Horse: def __init__(self, name): self.name = name def feature(self): return self.name def move(self): print("Horse") def speak(self): print("wuu") class Donkey: def __init__(self, name): self.name = name def feature(self): return self.name def move(self): print("Donkey") def speak(self): print("uui") class Mule(Horse, Donkey): def __init__(self, name, age): super().__init__(name) self.age = age mule1 = Mule('Doki', 2) mule1.move() # Horse mule1.speak() # Donkey print(mule1.feature()) # Horse
- 子类不能继承父类中的私有方法,也不能进行调用
多态
如果子类的方法与父类的方法同名,那么子类的方法将会进行重写