Python(面向对象编程4——继承顺序、封装)
继承顺序
''' 一点需要注意 ''' class Father: def f1(self): print("test func followed ==>") self.test() def test(self): print("from Father test") class Son(Father): def test(self): print("from son test") res=Son() res.f1()
结果 >>>: test func followed ==> from son test ''' 子类调用 self.test() 的时候任然要重新从自己开始找 .test()方法。 子类调用父类的属性,每次调用,都是优先从自己这里开始找,按照mro算法的顺序依次找下去,知道找到第一个符合的,所以不能只看定义的时候的单个类的情况。 '''
新式类继承:广度优先。
经典类继承:深度优先。
继承了object的类以及其子类,都是新式类
没有继承object的类以及其子类,都是经典类
Python3中默认继承object,所以Python3中都是新式类
Python2中不会默认继承object
class Foo: def __init__(self,val): self.__NAME=val #将所有的数据属性都隐藏起来 def getname(self): return self.__NAME #obj.name访问的是self.__NAME(这也是真实值的存放位置) def setname(self,value): if not isinstance(value,str): #在设定值之前进行类型检查 raise TypeError('%s must be str' %value) self.__NAME=value #通过类型检查后,将值value存放到真实的位置self.__NAME def delname(self): raise TypeError('Can not delete') name=property(getname,setname,delname) #不如装饰器的方式清晰 一种property的古老用法一种property的古老用法
绑定方法与非绑定方法
类中定义的函数分成两大类:
一:绑定方法(绑定给谁,谁来调用就自动将它本身当作第一个参数传入):
1. 绑定到类的方法:用classmethod装饰器装饰的方法。
为类量身定制
类.boud_method(),自动将类当作第一个参数传入
(其实对象也可调用,但仍将类当作第一个参数传入)
2. 绑定到对象的方法:没有被任何装饰器装饰的方法。
为对象量身定制
对象.boud_method(),自动将对象当作第一个参数传入
(属于类的函数,类可以调用,但是必须按照函数的规则来,没有自动传值那么一说)
二:非绑定方法:用staticmethod装饰器装饰的方法
1. 不与类或对象绑定,类和对象都可以调用,但是没有自动传值那么一说。就是一个普通工具而已
注意:与绑定到对象方法区分开,在类中直接定义的函数,没有被任何装饰器装饰的,都是绑定到对象的方法,可不是普通函数,对象调用该方法会自动传值,而staticmethod装饰的方法,不管谁来调用,都没有自动传值一说
1 staticmethod
statimethod不与类或对象绑定,谁都可以调用,没有自动传值效果,python为我们内置了函数staticmethod来把类中的函数定义成静态方法
import hashlib import time class MySQL: def __init__(self,host,port): self.id=self.create_id() self.host=host self.port=port @staticmethod def create_id(): #就是一个普通工具 m=hashlib.md5(str(time.clock()).encode('utf-8')) return m.hexdigest() print(MySQL.create_id) #<function MySQL.create_id at 0x0000000001E6B9D8> #查看结果为普通函数 conn=MySQL('127.0.0.1',3306) print(conn.create_id) #<function MySQL.create_id at 0x00000000026FB9D8> #查看结果为普通函数
2 classmethod
classmehtod是给类用的,即绑定到类,类在使用时会将类本身当做参数传给类方法的第一个参数(即便是对象来调用也会将类当作第一个参数传入),python为我们内置了函数classmethod来把类中的函数定义成类方法
import settings import hashlib import time class MySQL: def __init__(self,host,port): self.host=host self.port=port @classmethod def from_conf(cls): print(cls) return cls(settings.HOST,settings.PORT) print(MySQL.from_conf) #<bound method MySQL.from_conf of <class '__main__.MySQL'>> conn=MySQL.from_conf() print(conn.host,conn.port) conn.from_conf() #对象也可以调用,但是默认传的第一个参数仍然是类
- Python(面向对象编程4——继承顺序、封装)
- Python--面向对象的程序设计之继承实现的原理(继承顺序)、封装、property
- Py修行路 python基础 (十六)面向对象编程的 继承 多态与多态性 封装
- Python之面向对象编程:封装、继承、多态
- 初始python 类的继承与封装
- 面向对象编程三大特征,封装、继承和多态(一)
- Python新式类多重继承时的顺序
- Javascript 面向对象编程:封装、继承、
- 面向对象编程有三个特性:封装,继承,多态。
- python学习小结5:封装、继承、多态
- Python面向对象编程-封装
- [原创] JavaScript面向对象编程(2) :继承和封装
- Maxscript面向对象编程技术之封装与继承
- C语言面向对象编程(一):封装与继承
- python学习笔记14(多态、封装、继承)
- 面向对象编程三大特征 封装、继承和多态(二)
- 面向对象编程强调抽象、封装、继承、多态
- OOJ-面向对象编程的三大特点-封装,继承,多态分析与实例
- C语言面向对象编程(一):封装与继承
- Python学习27:继承以及多重继承方式,MRO(方法解释顺序)