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.多态

不同的子类对象调用相同的父类方法,产生不同的执行结果

 

 

  

 

posted @ 2020-02-27 00:55  bo0814  阅读(67)  评论(0)    收藏  举报