- 函数式编程
里面的函数是模块里的成员def fetch(backend): pass def add_record(backend, record): pass # 调用 fetch("xxxx") add_record("aaaa", xxx)
- 面向对象
里面的方法是类的成员class Mydemo: def fetch(self, backend): pass def add_record(self, backend, record): pass # 创建对象、实例 obj = Mydemo() # 调用 obj.fetch("xxx") obj.add_record("aa", xxx)
- tips:
面向对象不是所有情况都适用
- self, 形式参数。python内部传递
obj1 = Mydemo() obj1.fetch("xx") ==> self : obj1, backend : xx obj2 = Mydemo("xxx") ==> self : obj2, backend : xxx
- 封装的非主流方式
class Mydemo: def fetch(self): print(self.backend) def add_record(self, record): pass # 创建对象、实例 obj1 = Mydemo() # 在对象中封装数据,非主流的方式 obj1.backend = "www.xinmin.org" # 执行方法,执行过程中可以根据self去obj1中去取已封装在里面的数据 obj1.fetch() # www.xinmin.org obj2 = Mydemo() obj2.backend = "www.aaaa.org" obj1.fetch() # www.aaaa.org
- 封装的主流方式
class Foo: # 构造方法,创建对象的时候自动执行 def __init__(self, bk): self.name = "xinmin" self.favor = bk # 创建对象,并且将"xx"封装到对象中 obj1 = Foo("xx") obj2 = Foo("oo") # ======================================== class Person: def __init__(self, name, age, weight): self.name = name self.age = age self.weight = weight def eat(self): self.weight += 2 def sports(self): self.weight -= 1 # 创建对象 o1 = Person("小明", 20, 200) o1.eat() o1.sports() print(o1.weight) # 201
- 封装:
使用场景:当同一类型的方法具有相同参数时,直接封装到对象即可。
使用场景:把类当做模板,创建对个对象(对象内封装的数据可以不一样) - 继承:
派生类可以继承基类中所有的功能
派生类和基类同时存在某个功能时,优先找派生类(自己)
python类可以同时继承多个类,多继承(优先级:从左向右找
)# 父类(基类) class Animals: def __init__(self, name): self.name = name def eat(self): print(self.name + "吃") def drink(self): print(self.name + "喝") class Uncle: def sleep(self): print(self.name + "睡觉") def eat(self): print(self.name + "吃狗粮") # 子类(派生类) class Dog(Animals, Uncle): def speak(self): print(self.name + "汪汪汪") def drink(self): print(self.name + "喝牛犇犇") # 创建对象,调用方法 mm = Dog("二哈") mm.eat() # 二哈 吃 mm.drink() # 二哈 喝牛犇犇 mm.speak() # 二哈 汪汪汪 mm.sleep() # 二哈 睡觉
- 多继承经典题
class X(Object): def f1(self): print("X") class A(X): def f(self): print("A") class B(X): def f1(self): print("B") class C(A): def f(self): print("C") class D(B): def f1(self): print("D") class E(C, D): def f(self): print("E") obj = E() obj.f1() # D # 继承的寻找顺序:E -> C -> A -> D -> B -> X
- 多态
多种形态 - 扩展
重载,函数名相同,参数个数不同(python不支持)
重写,派生类中实现基类中的方法class Foo: def f1(self): print("Foo") class Bar: def f1(self): print("Bar") def func(arg): arg.f1() # python 本身支持多态 func(Foo()) func(Bar())
- 继承补充
class A: def bar(self): print("BAR") self.f1() def f1(self): print("A") class B(A): def f1(self): print("B") class C: def f1(self): print("C") class D(C, B): def f1(self): pass d1 = D() d1.bar() # BAR D -> C -> B -> A # C self.f1() -> D -> C -> B -> A
- 执行基类的构造方法
class Annimal: def __init__(self): print("Annimal的构造方法") self.ty = "动物" class Cat(Annimal): def __init__(self): print("Cat的构造方法") self.n = "喵" # 执行父类的构造方法 super(Cat, self).__init__() # 还可使用,但不推荐 # Annimal.__init__(self) # __init__()构造方法,类加入括号自动执行 # 对数据进行初始化 c = Cat() print(c.__dict__) # {'ty': '动物', 'n': '喵'}
网友评论