面向对象的三大特征
1. 封装
封装是一种信息隐蔽技术让我们的数据更加安全,
即将某些部分隐藏起来, 在程序外部看不到, 其含义是其他程序无法调用.
[好处]
1. 将变化隔离;
2. 便于使用;
3. 提高复用性;
4. 提高安全性;
实例:
- # 其实这仅仅这是一种变形操作
- # 类中所有双下划线开头的名称如__x 都会自动变形成:_类名__x 的形式:
- class A:
- __N=0 #类的数据属性就应该是共享的, 但是语法上是可以把类的数据属性设置成私有的如__N, 会变形为_A__N
- def __init__(self):
- self.__X=10 #变形为 self._A__X
- def __foo(self): #变形为_A__foo
- print('from A')
- def bar(self):
- self.__foo() #只有在类内部才可以通过__foo 的形式访问到.
- #A._A__N 是可以访问到的, 即这种操作并不是严格意义上的限制外部访问, 仅仅只是一种语法意义上的变形
这种自动变形的特点:
1. 类中定义的__x 只能在内部使用, 如 self.__x, 引用的就是变形的结果.
2. 这种变形其实正是针对外部的变形, 在外部是无法通过__x 这个名字访问到的.
3. 在子类定义的__x 不会覆盖在父类定义的__x, 因为子类中变形成了:_子类名__x, 而父类中变形成了:_父类名__x, 即双下滑线开头的属性在继承给子类时, 子类是无法覆盖的.
2. 继承
继承是子类自动共享父类之间数据和方法的机制.
python 中类的继承分为: 单继承和多继承
单继承
实例:
- # 父类
- class A(object):
- def __init__(self):
- self.num = 10
- def print_num(self):
- print(self.num + 10)
- c = A()
- print(c.num)
- # 子类
- class B(A):
- pass
- b = B()
- print(b.num)
- b.print_num()
多继承
实例:
- class Father():
- f_property = "白发带花君莫笑"
- def f_hobby(self):
- print("风流倜傥, 英俊潇洒")
- class Mother():
- m_property = "沉鱼落雁, 闭月羞花"
- def m_hobby(self):
- print("岁月从不败美人")
- # 多继承: 在括号里面用逗号, 把多个父类隔开
- class Daughter(Father, Mother):
- pass
- obj = Daughter()
- print(obj.f_property)
- obj.m_hobby()
多态
多态指的是一类事物有多种形态
动物有多种形态: 人, 狗, 猪
实例:
- import abc
- class Animal(metaclass=abc.ABCMeta): #同一类事物: 动物
- @abc.abstractmethod
- def talk(self):
- pass
- class People(Animal): #动物的形态之一: 人
- def talk(self):
- print('say hello')
- class Dog(Animal): #动物的形态之二: 狗
- def talk(self):
- print('say wangwang')
- class Pig(Animal): #动物的形态之三: 猪
- def talk(self):
- print('say aoao')
实例 2: 请用 python 解释器打开
- a = [1, 2, 3, 4, 5, 6]
- b = list("12345")
- a
- # 输出 [1, 2, 3, 4, 5, 6]
- b
- # 输出 b['1', '2', '3', '4', '5']
- a.__len__()
- # 输出结果 6
- b.__len__()
- # 输出结果 5
- c = "1314"
- c.__len__()
- # 输出结果 4
- len(a)
- # 输出结果 6
来源: http://www.bubuko.com/infodetail-3217375.html