03-面向对象1:引用、内置方法、身份运算符is、私有属性与方法、单继承与多继承、方法重写与多态
1.接收对象的变量是对对象的引用
对象变量记引用了对象的内存地址
1 class Cat: 2 def eat(self): 3 print('cat like eating fish') 4 5 def jump(self): 6 print('cat can jump') 7 8 tom = Cat() 9 jim = Cat() 10 11 print(tom) 12 print(jim) 13 addr = id(tom) 14 print('%x' % addr) # %d为十进制,%x为十六进制 15 16 # <__main__.Cat object at 0x7f7510e19f98> 变量记录着对象的内存地址 17 # <__main__.Cat object at 0x7f7510e19fd0> 内存地址不同 18 # 7f7510e19f98
2.几个内置方法
1.初始化方法__init__
当使用object = class()创建方法时,会自动执行以下操作:
1.为对象在内存中分配空间
2.为对象的属性设置初始值--调用初始化方法__init__
3.属性不知道设置成什么值,可以设置为None
4.属性可以为另一个类的对象
5.在创建对象时,使用类名(属性1,属性2...)调用,如Dog = Animal('wangcai')
2.__del__方法
对象被从内存中销毁前,会被 自动 调用
1 class Cat: 2 def __init__(self, new_name): 3 self.name = new_name 4 print('%s 来了' % self.name) 5 6 def __del__(self): 7 print('%s 死了' % self.name) 8 9 tom = Cat('Tom') 10 print(tom.name) 11 print(tom) 12 13 # Tom 来了 14 # Tom 15 # <__main__.Cat object at 0x7f19f2e92d68> 16 # Tom 死了 注意:最后才打印 Tom 死了
3.__str__方法
python中,使用print(object),默认会输出这个变量引用的对象是由哪一个类创建的,以及这个对象在内存中的地质。
如果在开发中,print(object)希望能够打印自定义内容,就可以用__str__这个方法
注意:__str__方法必须返回一个字符串
1 class Cat: 2 def __init__(self, new_name): 3 self.name = new_name 4 5 def __str__(self): 6 return 'my name is %s' % self.name 7 8 tom = Cat('Tom') 9 print(tom.name) 10 print(tom) 11 12 # Tom 13 # my name is Tom
3.身份运算符is和is not
用于比较两个对象的 内存地址 是否一致,是否是对同一对象的引用
在python 中针对 None 的比较,建议使用 is 而不是 ==
1 a = [1, 2, 3] 2 b = [1, 2, 3] 3 print(a == b) # True 4 print(a is b) # False
5.私有属性和私有方法
仅在对象内部可以使用,外部无法访问到,子类中也无法直接访问到父类中的私有属性与私有方法
定义方式:定义属性或方法时,在属性名或方法名之前 增加 两个下划线。
1 class Women: 2 def __init__(self, name): 3 self.name = name 4 self.__age = age 5 6 def __secret(self): 7 print("%s's age is %s" % (self.name, self.__age))
6.单继承与方法的重写
1.单继承
子类继承父类的所有属性与方法(除了私有属性与私有方法外)
1)语法:
class 子类名(父类名):
pass
2)术语
· Dog类是Animal类的子类,Animal类是Dog类的父类,Dog类从Animal类继承
· Dog类是Animal类的派生类,Animal类是Dog类的基类,Dog类从Animal类派生
(object类是所有类的基类,定义父类的时候通常用 class 父类名(object): )
3)继承的传递性
C类从B类继承,B类又从A类继承
2.方法的重写
1)重写父类的某个方法即可覆盖
2)对父类的方法进行扩展
1.在子类中重写父类方法
2.在需要的位置使用 super().父类方法 来调用父类方法的执行
3.针对子类的需求,编写子类特有的代码实现
1 class Dog: 2 def __init__(self): 3 pass 4 5 def bark(self): 6 print('汪汪叫') 7 8 9 class XiaoTianQuan(Dog): # 继承 10 def bark(self): 11 # 针对子类特有需求编写代码 12 print('呜呜呜') 13 # 使用super().调用原本父类中封装的方法 14 super().bark() 15 # 增加其他子类需要的代码 16 print('喵喵喵')
7.多继承
子类可以拥有多个父类,并且具有所有父类的属性和方法
语法:
class 子类名(父类名1,父类名2...):
pass
注意:如果父类之间存在同名的属性或方法,则应该避免使用多继承
8.多态
不同的子类对象调用相同的父类方法,产生不同的执行结果
浙公网安备 33010602011771号