Python面向对象(其一)


python 面向对象(其一)

面向对象基本释义

  • 对象: 具有一系列属性方法的集合
  • 举例:

    ---------------------------------------
                      同学小明
    --------------------属性----------------
    名字: 小明
    父亲:(未知)
    母亲:(未知)
    性别:男
    年龄:15   
    --------------------方法----------------
    滚出去: 调用此方法可以让小明滚出教室
    闭嘴: 调用此方法可以让小明闭嘴
    告密:(仅老师可用)
    写给阿花从未寄出去的表白信:(仅自己可知)
  • 属性说明:

    • 小明的名字、年龄、性别,对外可见,就是public属性;
    • 小明的父亲、母亲对外不可见,只有小明知道,这个就是private属性;
    • 如果小明还有兄弟姐妹,那么父亲、母亲这两个属性对兄弟姐妹父母都是可见的,这个就是protected属性,即有选择范围的对外可见
      • 一般情况下指的是同一个package范围
  • 方法说明:
    • 滚出去、闭嘴这两个是任何人可以对小明进行调用的方法,默认public
    • 告密是只有指定的人才可以调用,即选择性开放,一般为proteced
    • 从未寄出去的表百姓,就是私有方法,除了自己谁都不知道,private

说明:
1. Python中默认是没有proteced属性的,而且共有私有之间隔离并不是完全绝对
2. Python中所有类型默认都是对象形式组织

面向对象在类中的体现

上面说的小明,用代码表述出来就是:

 1 #! coding:utf-8
 2 # object是对象类,也是python种一切对象的父类;所有的类型都显示/隐式的继承自object
 3 # 平时使用时,可以直接写class XiaoMing
 4 class XiaoMing(object):
 5 
 6     name = "小明"
 7     age = 15
 8     gender = ""
 9 
10     __father = "father_of_xiaoming"
11     __mother = "mother_of_xiaoming"
12 
13     def __init__(self, relationship):
14         self.relationship = relationship
15 
16     def goOut(self):
17         '''
18             小明滚出去
19         '''
20         print "Xiaoming, your %s let you go out"%self.relationship
21 
22     def shutUp(self):
23         '''
24             小明闭嘴
25         '''
26         print "Xiaoming, your %s let you shut up"%self.relationship
27 
28     # python没有proteced,默认为同一个package可以直接调用
29     def gaoMi(self):
30         '''
31             告密
32         '''
33         pass
34 
35     #私有方法,开头方式是这样
36     def __sayLove(self):
37         '''
38             写一封不敢寄出去的情书,唉,少年应许多情
39         '''
40         print "%s, you should not watch it!"%self.relationship

 

小明这个类的使用过程是这样的

#实例化一个对象
xiaoming = XiaoMing("dude")
print xiaoming.name
print xiaoming.age
print xiaoming.gender
xiaoming.goOut()
xiaoming.shutUp()
xiaoming.gaoMi()

# ======output======== #
# 小明
# 15
#
# Xiaoming, your dude let you go out
# Xiaoming, your dude let you shut up

 

Python中对象的应用

在python中可以通过dir(obj)来查看每个对象当前可用的属性和方法,如:

print dir(xiaoming)

# ======output======== #
#['_XiaoMing__father', '_XiaoMing__mother', '_XiaoMing__sayLove', '__doc__', '__init__', '__module__', 'age', 'gaoMi', 'gender', 'goOut', 'name', 'relationship', 'shutUp']

 

上面例子中,注意_XiaoMing__father_XiaoMing__mother,这两个属性为私有变量__father、__mother的外部调用方式,如下:

print xiaoming._XiaoMing__father
# ======output======== #
# father_of_xiaoming

 

python中一切皆对象,凡是对象都可以用dir(obj)来查看属性方法,可以试试

类继承与重构

小明长大变超人了!

    ---------------------------------------
                      超人小明
    --------------------属性----------------
    年龄:30   
    必杀技:镭射光线!biubiu!
    --------------------方法----------------
    滚出去: 谁敢叫本超人滚出去,站出来试试!
    告密:已经不需要告密了
    写给老婆阿芳的家信:暗恋的人最终没有成为自己的老婆啊
  • 属性说明:
    • 超人小明仍然具备同学小明的一切属性,除了年龄在长大
    • 超人小明有了自己的必杀技,毕竟是超人嘛
  • 方法说明:
    • 滚出去:现如今哪个不怕死的敢让超人滚出去
    • 告密:那些黑历史怎么可能重提
    • 写给老婆阿芳的家信:心里也继续暗恋阿花,但毕竟有了自己的老婆了

如上,超人小明是同学小明后续的一个可能,也就是扩展子类,用代码描述为:

#! coding:utf-8
class SuperManXiaoMing(XiaoMing):

    action = "镭射光线!biubiu!"
    def __init__(self, relationship):
        super(SuperManXiaoMing, self).__init__(relationship)
        self.age = 30

    def goOut(self):
        print "现如今哪个不怕死的敢让超人滚出去! %s 你小子活腻歪了是吧!"%self.relationship

    def gaoMi(self):
        pass

    def loveToWife(self):
        print "阿芳,额想你!"

 

调用的例子为:

    superman = SuperManXiaoMing("dude")
    print superman.name
    print superman.age
    print superman.gender
    print superman.action
    superman.goOut()
    superman.shutUp()
    superman.gaoMi()
    superman.loveToWife()

    print dir(superman)
    print superman._XiaoMing__father
# ======output======== # # 小明 # 30 # # 现如今哪个不怕死的敢让超人滚出去! dude 你小子活腻歪了是吧! # Xiaoming, your dude let you shut up # 阿芳,额想你! # ['_XiaoMing__father', '_XiaoMing__mother', '_XiaoMing__sayLove', '__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'action', 'age', 'gaoMi', 'gender', 'goOut', 'loveToWife', 'name', 'relationship', 'shutUp'] # father_of_xiaoming

 

看,上述输出中,gaoMi没有输出,因为被pass了。其他父类子类的内容全在里面了。

思考1

  • 掌握上述知识可以做什么?
  • 继承父类,super(className, self).init() 和 ParentClass.init()区别是什么?
  • 类的使用场景有哪些?
  • 对测试而言,类的好处与不好处有哪些?

转载于:https://www.cnblogs.com/SilenceCity/p/pythonOO1.html

你可能感兴趣的:(python)