python24 面向对象的绑定方法 类与类之间的继承
复习
# 执行时机:当实例化产生对象时会自动执行该函数
# 会自动传入需要初始化的对象
# 初始化必须包含至少一个参数 用于表示对象本身
# 该函数不允许有返回值 必须为None
``` 2.绑定方法和非绑定方法 2.1## 绑定方法 概念: 绑定即两个东西绑在一起 方法就是函数 那就是说绑定方法 == 绑定函数 默认情况下: 在类中定义的方法 都是绑定方法 绑定方法 :是把函数和对象绑定到一起 2.2为什么要绑定: 每个应用程序其实本质上都是在处理数据,那就必须明确 要处理的数据在哪里,如何处理 绑定方法的好处在于,将需要处理的数据 以及处理数据的方法绑定在一起,这样一来 当你获得一个对象就同时获得 数据以及 相应的处理方法 ,简单的调用即可 2.3### 绑定方法与普通函数的区别: 当使用类调用时,就是一个普通函数 有几个参数就得传几个参数 当用对象来调用时,是一个绑定方法了,会自动将对象作为第一个参数传入 2.4一个类中可以有属性和方法 方法分为两种 1.绑定方法 1.1对象绑定方法 在使用对象调用时会自动传入对象本身 1.2类绑定方法 @classmethod 在使用对象调用时会自动传入类本身 在使用类来调用时也会自动传入类本身 单例模式中就会经常使用@classmethod 1.3到底绑定给谁? 当你的方法执行过程中需要使用到对象中数据时就绑定给对象 当你的方法执行过程中需要使用到类中数据时就绑定给类 2.非绑定方法 即不需要对象中的数据 也不需要类中的数据 那就定义为非绑定方法,就是普通函数 @staticmethod oop(面向对象)知识点: 1.属性应该放在类中还是对象中 (公有的放在类中,各自独有的放在函数中)
2.绑定方法 == 绑定函数 对象绑定方法 对象调用时 自动传入对象本身 类调用时不会自动传参 有几个就需要传几个 类绑定方法 @classmethod 无论是对象还是类调用 都会自动传入类本身 非绑定方法(静态方法) @staticmethod 谁调用都不会自动传参
#面向对象的思路分析: # 在使用面向对象编程时 1.首先要想的是 =》需要什么对象, 2.这些对象具备什么样的属性和什么样的行为, 3.根据属性和行为创建对应的类 3.抽象与继承 3.1# 继承: 生活中: 继承指的是一种关系,在生活中通过继承关系,例如王思聪继承王健林,对于王思聪可以,可以直接使用王健林已经拥有的 被继承的一方(王健林) 称之为父 继承的一方(王思聪) 称之为子 编程中: 在OOP(面向对象)中 继承描述是类和类之间的关系 例如b类继承a类 b类可以直接使用a类中的属性和方法 a是父类(基类,超类) b是子类(派生类) 优点: 好处:极大的提高了代码的复用性 3.2如何使用继承,=>至少需要两个类 语法: class 子类名称(父类名称): pass ```python
class Teacher:
school = "oldboy"
def __init__(self,name,age):
self.name = name
self.age = age def say_hi(self):
print("hello i am %s" % self.name)
def teach(self):
print("正在教书......") class Student(Teacher):
pass print(Student.school)
print(Student.say_hi)
print(Teacher.say_hi) s = Student("rose","123")
s.say_hi()
s.teach() 在上述案例中通过继承 学生就拥有了老师的所有内容 但是学生不应该教书这个技能
意味着这个继承关系 有问题 不合理
需要先抽象 在继承
``` 3.3# 抽像与继承 继承之后可以直接使用父类的属性和方法 使用继承时 应该先抽象 在继承 抽象指的是 将一系列类中相同的特征和相同行为抽取 形成一个新的类 会产生一些与原本业务不想关的类 站在不同角度会得到不同的抽象结果 案例: ```python
# 抽象得到的公共父类
class OldBoyPerson:
school = "oldboy"
def __init__(self,name,age):
self.name = name
self.age = age def say_hi(self):
print("hello i am %s" % self.name) class Teacher(OldBoyPerson):
def teach(self):
print("正在教书......")
class Student(OldBoyPerson):
pass
# 测试
t = Teacher("owen",38)
t.say_hi()
t.teach() s = Student("歌王",20)
s.say_hi() ``` 3.4# 在python3中任何类都直接或间接继承自Object Object是所有类的基类 (根类) 其中提供一系列方法, 这样一来 无论你是什么类 ,你都可以直接是object中已经存在的方法
一切皆对象 一切皆对象指的是 在python中您所使用到的任何数据都是对象 int float list dict 模块 包 函数 3.5# 属性的查找顺序
#对象自己 - > 所在的类 -> 所在类的父类 -> 父类的父类 -> object
class A:
name = "scot"
# def __str__(self):
# print("111111111")
# pass
pass class B(A):
name = "rose"
pass b = B()
# b.name = "jack"
print(b.name)
``` 3.6# 派生与覆盖 子类拥有与父类不同的内容 就称之为派生类 覆盖 指的是子类出现了与父类完全相同(属性/方法)名称 根据查找顺序 就会优先找子类的 即覆盖了父类的内容 # 在子类中访问父类已有的方法或属性 class Person:
text = "321"
def __init__(self,name,age,gender):
self.name = name
self.age = age
self.gender = gender def sleep(self):
print("人类 午睡 躺着睡!") def say_hi(self):
print("my name :%s my age :%s my gender: %s " % (self.name,self.age,self.gender),end="")
class Student(Person):
text = "123"
def __init__(self,name,age,gender,number): 3.7直接调用父类的方法(三种:主要是super()应用)
#======================================================================重点在这里
# 由于父类已经存在一个方法可以完成这个三参数的初始化
# 所以可以直接调用父类的初始化完成这部分的初始化工作
# 方法1
# Person.__init__(self,name,age,gender) # 指名道姓的调用 # 方法2 在py2中不支持
super().__init__(name,age,gender) # py2的写法
# super(Student, self).__init__(name,age,gender)
self.number = number
#====================================================================== # 访问父类的属性
def show_text(self):
print(self.text)
print(super().text) def say_hi(self):
super().say_hi()
print("my number: %s" % self.number)
# print("my name :%s my age :%s my gender: %s my number: %s" % (self.name, self.age, self.gender,self.number))
s = Student("jack",20,"man","007")
s.say_hi()
# s.show_text()
```
扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄
1. xml模块1.__init__函数 1.1引申 ## 类属性与对象属性 类: 类中应该仅存储所有对象共有的内容 如:所有人的国籍相同那就放到类中 对象: 对象中存储每个对象独有的内容 如:每个人的名字都不同 1.2.## __init__方法的作用 概念: init 是初始化的缩写 用途: 用于为对象的属性设置初始值 特点: ```
解析xml格式的文档
可扩展的标记语言
<tag name="123" >text</tag>
<tag1>
<tag2>
</tag2>
</tag1>
<tag/>
1. tree = ElementTree.parser("文件路径")
root = tree.getroot()
root.iter/find/findall
直接遍历某标签 取出所有子级
element.text = ""
element.tag = "xxx"
element.set("k","v")
要删除需要先找父级
父级.remove(子标签对象)
父级.append(子标签)
tree.write("路径")
2.面向对象的基本概念
是一种编程思想,
优点:扩展性高,复用性强,可维护性好
缺点:编程复杂度提高了,需要先设计,结果无法准确预知
使用场景:对扩展性要求高的程序
面向过程:
优点:复杂问题简单化,流程化
缺点:扩展性极低,牵一发动全身,维护性相比OOP低
使用场景:对扩展性要求低的程序
将程序员从一个具体的操作者转变为指挥者
3.类与对象的关系
对象是 具备某些特征和行为的结合体,是具体存在的某个事物
类 某些具备相同特征和相同行为的集合体,是一种抽象概念
创建类的语法
class 大驼峰命名:
属性用变量标识 (数据属性)
名称=值
行为用函数表示 (函数属性/方法)
def 函数名称
创建对象
类名加括号
Person()
4.属性的访问顺序
优先访问对象自己的 如果没有 再访问类中的
#今日内容
1.__init__函数 *****
2.绑定方法和非绑定方法 *****
3.抽象与继承
# 执行时机:当实例化产生对象时会自动执行该函数
# 会自动传入需要初始化的对象
# 初始化必须包含至少一个参数 用于表示对象本身
# 该函数不允许有返回值 必须为None
``` 2.绑定方法和非绑定方法 2.1## 绑定方法 概念: 绑定即两个东西绑在一起 方法就是函数 那就是说绑定方法 == 绑定函数 默认情况下: 在类中定义的方法 都是绑定方法 绑定方法 :是把函数和对象绑定到一起 2.2为什么要绑定: 每个应用程序其实本质上都是在处理数据,那就必须明确 要处理的数据在哪里,如何处理 绑定方法的好处在于,将需要处理的数据 以及处理数据的方法绑定在一起,这样一来 当你获得一个对象就同时获得 数据以及 相应的处理方法 ,简单的调用即可 2.3### 绑定方法与普通函数的区别: 当使用类调用时,就是一个普通函数 有几个参数就得传几个参数 当用对象来调用时,是一个绑定方法了,会自动将对象作为第一个参数传入 2.4一个类中可以有属性和方法 方法分为两种 1.绑定方法 1.1对象绑定方法 在使用对象调用时会自动传入对象本身 1.2类绑定方法 @classmethod 在使用对象调用时会自动传入类本身 在使用类来调用时也会自动传入类本身 单例模式中就会经常使用@classmethod 1.3到底绑定给谁? 当你的方法执行过程中需要使用到对象中数据时就绑定给对象 当你的方法执行过程中需要使用到类中数据时就绑定给类 2.非绑定方法 即不需要对象中的数据 也不需要类中的数据 那就定义为非绑定方法,就是普通函数 @staticmethod oop(面向对象)知识点: 1.属性应该放在类中还是对象中 (公有的放在类中,各自独有的放在函数中)
2.绑定方法 == 绑定函数 对象绑定方法 对象调用时 自动传入对象本身 类调用时不会自动传参 有几个就需要传几个 类绑定方法 @classmethod 无论是对象还是类调用 都会自动传入类本身 非绑定方法(静态方法) @staticmethod 谁调用都不会自动传参
#面向对象的思路分析: # 在使用面向对象编程时 1.首先要想的是 =》需要什么对象, 2.这些对象具备什么样的属性和什么样的行为, 3.根据属性和行为创建对应的类 3.抽象与继承 3.1# 继承: 生活中: 继承指的是一种关系,在生活中通过继承关系,例如王思聪继承王健林,对于王思聪可以,可以直接使用王健林已经拥有的 被继承的一方(王健林) 称之为父 继承的一方(王思聪) 称之为子 编程中: 在OOP(面向对象)中 继承描述是类和类之间的关系 例如b类继承a类 b类可以直接使用a类中的属性和方法 a是父类(基类,超类) b是子类(派生类) 优点: 好处:极大的提高了代码的复用性 3.2如何使用继承,=>至少需要两个类 语法: class 子类名称(父类名称): pass ```python
class Teacher:
school = "oldboy"
def __init__(self,name,age):
self.name = name
self.age = age def say_hi(self):
print("hello i am %s" % self.name)
def teach(self):
print("正在教书......") class Student(Teacher):
pass print(Student.school)
print(Student.say_hi)
print(Teacher.say_hi) s = Student("rose","123")
s.say_hi()
s.teach() 在上述案例中通过继承 学生就拥有了老师的所有内容 但是学生不应该教书这个技能
意味着这个继承关系 有问题 不合理
需要先抽象 在继承
``` 3.3# 抽像与继承 继承之后可以直接使用父类的属性和方法 使用继承时 应该先抽象 在继承 抽象指的是 将一系列类中相同的特征和相同行为抽取 形成一个新的类 会产生一些与原本业务不想关的类 站在不同角度会得到不同的抽象结果 案例: ```python
# 抽象得到的公共父类
class OldBoyPerson:
school = "oldboy"
def __init__(self,name,age):
self.name = name
self.age = age def say_hi(self):
print("hello i am %s" % self.name) class Teacher(OldBoyPerson):
def teach(self):
print("正在教书......")
class Student(OldBoyPerson):
pass
# 测试
t = Teacher("owen",38)
t.say_hi()
t.teach() s = Student("歌王",20)
s.say_hi() ``` 3.4# 在python3中任何类都直接或间接继承自Object Object是所有类的基类 (根类) 其中提供一系列方法, 这样一来 无论你是什么类 ,你都可以直接是object中已经存在的方法
一切皆对象 一切皆对象指的是 在python中您所使用到的任何数据都是对象 int float list dict 模块 包 函数 3.5# 属性的查找顺序
#对象自己 - > 所在的类 -> 所在类的父类 -> 父类的父类 -> object
class A:
name = "scot"
# def __str__(self):
# print("111111111")
# pass
pass class B(A):
name = "rose"
pass b = B()
# b.name = "jack"
print(b.name)
``` 3.6# 派生与覆盖 子类拥有与父类不同的内容 就称之为派生类 覆盖 指的是子类出现了与父类完全相同(属性/方法)名称 根据查找顺序 就会优先找子类的 即覆盖了父类的内容 # 在子类中访问父类已有的方法或属性 class Person:
text = "321"
def __init__(self,name,age,gender):
self.name = name
self.age = age
self.gender = gender def sleep(self):
print("人类 午睡 躺着睡!") def say_hi(self):
print("my name :%s my age :%s my gender: %s " % (self.name,self.age,self.gender),end="")
class Student(Person):
text = "123"
def __init__(self,name,age,gender,number): 3.7直接调用父类的方法(三种:主要是super()应用)
#======================================================================重点在这里
# 由于父类已经存在一个方法可以完成这个三参数的初始化
# 所以可以直接调用父类的初始化完成这部分的初始化工作
# 方法1
# Person.__init__(self,name,age,gender) # 指名道姓的调用 # 方法2 在py2中不支持
super().__init__(name,age,gender) # py2的写法
# super(Student, self).__init__(name,age,gender)
self.number = number
#====================================================================== # 访问父类的属性
def show_text(self):
print(self.text)
print(super().text) def say_hi(self):
super().say_hi()
print("my number: %s" % self.number)
# print("my name :%s my age :%s my gender: %s my number: %s" % (self.name, self.age, self.gender,self.number))
s = Student("jack",20,"man","007")
s.say_hi()
# s.show_text()
```

更多精彩