1.类与对象(构造方法与实例化)

#!/usr/bin/env python
# _*_ coding:UTF-8 _*_

class Province:

    def __init__(self, name, capital, leader):
        self.name = name
        self.capital = capital
        self.leader = leader

if __name__ == "__main__":
    hebei = Province("河北", "石家庄", "刘道强")
    print hebei.name
    print hebei.capital
    print hebei.leader

结果:

/Users/liudaoqiang/PycharmProjects/numpy/venv/bin/python /Users/liudaoqiang/Project/python_project/day05/day18/Province.py
河北
石家庄
刘道强

Process finished with exit code 0

注意:定义构造方法使用__init__方法

2.动态字段与静态字段

#!/usr/bin/env python
# _*_ coding:UTF-8 _*_

class Province:

    memo = "中国的23个省之一"

    def __init__(self, name, capital, leader):
        self.name = name
        self.capital = capital
        self.leader = leader

if __name__ == "__main__":
    hebei = Province("河北", "石家庄", "刘道强")
    print hebei.name
    print hebei.capital
    print hebei.leader

    print hebei.memo
    print Province.memo

结果:

/Users/liudaoqiang/PycharmProjects/numpy/venv/bin/python /Users/liudaoqiang/Project/python_project/day05/day18/Province.py
河北
石家庄
刘道强
中国的23个省之一
中国的23个省之一

Process finished with exit code 0

注意:

(1)类不能访问动态字段

(2)对象可以访问静态字段

3.动态方法与静态方法

#!/usr/bin/env python
# _*_ coding:UTF-8 _*_

class Province:

    memo = "中国的23个省之一"

    def __init__(self, name, capital, leader):
        self.name = name
        self.capital = capital
        self.leader = leader

    def sports_meeting(self):
        return self.name + "正在开运动会"

    @staticmethod
    def foo():
        return "每个省都在反腐"

if __name__ == "__main__":
    hebei = Province("河北", "石家庄", "刘道强")
    print hebei.name
    print hebei.capital
    print hebei.leader

    print hebei.memo
    print Province.memo

    print hebei.sports_meeting()
    print hebei.foo()
    print Province.foo()

结果:

/Users/liudaoqiang/PycharmProjects/numpy/venv/bin/python /Users/liudaoqiang/Project/python_project/day05/day18/Province.py
河北
石家庄
刘道强
中国的23个省之一
中国的23个省之一
河北正在开运动会
每个省都在反腐
每个省都在反腐

Process finished with exit code 0

注意:

(1)类不能访问动态方法

(2)对象可以方位静态方法

(3)在动态方法上增加@staticmethod并去除self参数则为动态方法

4.特性

#!/usr/bin/env python
# _*_ coding:UTF-8 _*_

class Province:

    memo = "中国的23个省之一"

    def __init__(self, name, capital, leader):
        self.name = name
        self.capital = capital
        self.leader = leader

    def sports_meeting(self):
        return self.name + "正在开运动会"

    @staticmethod
    def foo():
        return "每个省都在反腐"

    @property
    def bar(self):
        return self.name

if __name__ == "__main__":
    hebei = Province("河北", "石家庄", "刘道强")
    print hebei.name
    print hebei.capital
    print hebei.leader

    print hebei.memo
    print Province.memo

    print hebei.sports_meeting()
    print hebei.foo()
    print Province.foo()

    print hebei.bar

结果:

/Users/liudaoqiang/PycharmProjects/numpy/venv/bin/python /Users/liudaoqiang/Project/python_project/day05/day18/Province.py
河北
石家庄
刘道强
中国的23个省之一
中国的23个省之一
河北正在开运动会
每个省都在反腐
每个省都在反腐
河北

Process finished with exit code 0

注意:

(1)在方法上增加@property则该方法变为字段访问

5.面向对象中动态方法与静态方法的比较

(1)使用动态方法适合于业务类;适用于对象数量较少的情况

(2)使用静态方法适合于工具类;适用于对象数量较多的情况,当对象较多则创建对象占用大量的内存这时应该使用静态方法

6.私有字段与私有方法

#!/usr/bin/env python
# _*_ coding:UTF-8 _*_

class Province:

    memo = "中国的23个省之一"

    def __init__(self, name, capital, leader, __thailand):
        self.name = name
        self.capital = capital
        self.leader = leader
        self.__thailand = __thailand

    def sports_meeting(self):
        return self.name + "正在开运动会"

    @staticmethod
    def foo():
        return "每个省都在反腐"

    @property
    def bar(self):
        return self.name

    @property
    def thailand(self):
        return self.__thailand

if __name__ == "__main__":
    hebei = Province("河北", "石家庄", "刘道强", True)
    print hebei.name
    print hebei.capital
    print hebei.leader

    print hebei.memo
    print Province.memo

    print hebei.sports_meeting()
    print hebei.foo()
    print Province.foo()

    print hebei.bar

    print hebei.thailand

结果:

/Users/liudaoqiang/PycharmProjects/numpy/venv/bin/python /Users/liudaoqiang/Project/python_project/day05/day18/Province.py
河北
石家庄
刘道强
中国的23个省之一
中国的23个省之一
河北正在开运动会
每个省都在反腐
每个省都在反腐
河北
True

Process finished with exit code 0

注意:

(1)任何暴露给外部是无用的,或者为了安全不能暴露给外部的字段和方法需要设置为私有;设置私有字段和私有方法只需在前边加上两个下划线即可

(2)私有字段在类内部可以直接访问,在类外部不能访问,可以通过实现特性来访问私有字段

(3)私有方法在类内部可以直接访问,在类外部不能访问,可以通过封装共有方法来访问私有方法

7.只读特性与可写特性

#!/usr/bin/env python
# _*_ coding:UTF-8 _*_

class Province:

    memo = "中国的23个省之一"

    def __init__(self, name, capital, leader, __thailand):
        self.name = name
        self.capital = capital
        self.leader = leader
        self.__thailand = __thailand

    def sports_meeting(self):
        return self.name + "正在开运动会"

    @staticmethod
    def foo():
        return "每个省都在反腐"

    @property
    def bar(self):
        return self.name

    @property
    def thailand(self):
        return self.__thailand

    @thailand.setter
    def thailand(self, __thailand):
        self.__thailand = __thailand

if __name__ == "__main__":
    hebei = Province("河北", "石家庄", "刘道强", True)
    print hebei.name
    print hebei.capital
    print hebei.leader

    print hebei.memo
    print Province.memo

    print hebei.sports_meeting()
    print hebei.foo()
    print Province.foo()

    print hebei.bar

    print hebei.thailand
    hebei.thailand = False
    print hebei.thailand

结果:

/Users/liudaoqiang/PycharmProjects/numpy/venv/bin/python /Users/liudaoqiang/Project/python_project/day05/day18/Province.py
河北
石家庄
刘道强
中国的23个省之一
中国的23个省之一
河北正在开运动会
每个省都在反腐
每个省都在反腐
河北
True
False

Process finished with exit code 0
/Users/liudaoqiang/PycharmProjects/numpy/venv/bin/python /Users/liudaoqiang/Project/python_project/day05/day18/Province.py
河北
石家庄
刘道强
中国的23个省之一
中国的23个省之一
河北正在开运动会
每个省都在反腐
每个省都在反腐
河北
True
False

Process finished with exit code 0

注意

(1)使用@property装饰器则私有字段可读;使用@field.setter则私有字段可写

8.构造方法__init__(),析构方法__del__()和__call__()

#!/usr/bin/env python
# _*_ coding:UTF-8 _*_

class Province:

    memo = "中国的23个省之一"

    def __init__(self, name, capital, leader, __thailand):
        self.name = name
        self.capital = capital
        self.leader = leader
        self.__thailand = __thailand

    def __call__(self, *args, **kwargs):
        print "CALL"

    def __del__(self):
        print "DELETE"

    def sports_meeting(self):
        return self.name + "正在开运动会"

    @staticmethod
    def foo():
        return "每个省都在反腐"

    @property
    def bar(self):
        return self.name

    @property
    def thailand(self):
        return self.__thailand

    @thailand.setter
    def thailand(self, __thailand):
        self.__thailand = __thailand

if __name__ == "__main__":
    hebei = Province("河北", "石家庄", "刘道强", True)
    print hebei.name
    print hebei.capital
    print hebei.leader

    print hebei.memo
    print Province.memo

    print hebei.sports_meeting()
    print hebei.foo()
    print Province.foo()

    print hebei.bar

    print hebei.thailand
    hebei.thailand = False
    print hebei.thailand

    hebei()

结果:

/Users/liudaoqiang/PycharmProjects/numpy/venv/bin/python /Users/liudaoqiang/Project/python_project/day05/day18/Province.py
河北
石家庄
刘道强
中国的23个省之一
中国的23个省之一
河北正在开运动会
每个省都在反腐
每个省都在反腐
河北
True
False
CALL
DELETE

Process finished with exit code 0

注意:

__init__(self)在创建对象的时候触发调用

__del__(self)在销毁对象的时候触发调用

__call__(self)在对象()调用时触发调用

9.类的继承

#!/usr/bin/env python
# _*_ coding:UTF-8 _*_

class Base:

    def __int__(self):
        pass

    def __call__(self, *args, **kwargs):
        pass

    def __del__(self):
        pass

    def foo(self):
        print "foo"

    def bar(self):
        print "bar"

class Derive(Base):
    def __int__(self):
        pass

    def __call__(self, *args, **kwargs):
        pass

    def __del__(self):
        pass

    def bar(self):
        Base.bar(self)
        print "derive"

if __name__ == "__main__":
    base = Base()
    base.foo()
    base.bar()

    derive = Derive()
    derive.foo()
    derive.bar()

结果:

/Users/liudaoqiang/PycharmProjects/numpy/venv/bin/python /Users/liudaoqiang/Project/python_project/day05/day18/extend_test.py
foo
bar
foo
bar
derive

Process finished with exit code 0

注意:

(1)继承只需要的类名的后面加上基类的名称

(2)调用基类的方法则用Base.bar(self)

10. 多继承

经典类的深度优先多继承:

#!/usr/bin/env python
# _*_ coding:UTF-8 _*_

class A:
    def __init__(self):
        print "init A"

    def save(self):
        print "save from A"

class B(A):
    def __init__(self):
        print "init B"

class C(A):
    def __init__(self):
        print "init C"

    def save(self):
        print "save from C"

class D(B, C):
    def __init__(self):
        print "init D"

if __name__ == "__main__":
    d = D()
    d.save()

结果:

/Users/liudaoqiang/PycharmProjects/numpy/venv/bin/python /Users/liudaoqiang/Project/python_project/day05/day18/object_test.py
init D
save from A

Process finished with exit code 0

新式类的广度优先多继承:

#!/usr/bin/env python
# _*_ coding:UTF-8 _*_

class A(object):
    def __init__(self):
        print "init A"

    def save(self):
        print "save from A"

class B(A):
    def __init__(self):
        print "init B"

class C(A):
    def __init__(self):
        print "init C"

    def save(self):
        print "save from C"

class D(B, C):
    def __init__(self):
        print "init D"

if __name__ == "__main__":
    d = D()
    d.save()

结果:

/Users/liudaoqiang/PycharmProjects/numpy/venv/bin/python /Users/liudaoqiang/Project/python_project/day05/day18/object_test.py
init D
save from C

Process finished with exit code 0

注意:

(1)python中的类如果不继承object则为经典类,如果继承object类则为新式类

(2)经典类的多继承采用深度优先算法继承,新式类的多继承采用广度优先算法继承

11.接口,抽象类,抽象方法

例如:

#!/usr/bin/env python
# _*_ coding:UTF-8 _*_

from abc import ABCMeta, abstractmethod

class Foo:

    __metaclass__ = ABCMeta

    def save(self):
        pass

class Bar(Foo):
    def __init__(self):
        print "init Bar"

    def save(self):
        print "save from Bar"

if __name__ == "__main__":
    bar = Bar()
    bar.save()

结果:

/Users/liudaoqiang/PycharmProjects/numpy/venv/bin/python /Users/liudaoqiang/Project/python_project/day05/day18/abstract_test.py
init Bar
save from Bar

Process finished with exit code 0

注意:

(1)抽象类中只有抽象方法即为借口

(2)类中有__metaclass__ = ABCMeta的类即为抽象类;方法被@abstractmethod装饰即为抽象方法

老男孩python学习自修第十八天【面向对象】的更多相关文章

  1. 老男孩python学习自修第二十四天【多进程】

    1. 体验多进程的运行速度 #!/usr/bin/env python # _*_ coding:UTF-8 _*_ from multiprocessing import Pool import t ...

  2. 老男孩python学习自修第二十三天【多线程】

    1. 线程的创建与运行 #!/usr/bin/env python # _*_ coding:UTF-8 _*_ from threading import Thread def foo(param1 ...

  3. 老男孩 python学习自修第二十二天【文件上传与下载】

    1.使用socket实现文件上传 server.py #!/usr/bin/env python # _*_ coding:UTF-8 _*_ import os import SocketServe ...

  4. 老男孩python学习自修第十九天【异常处理】

    1.常见的错误 TypeError 类型错误 NameError 没有该变量 ValueError 不期望的值 AttributeError 没有该属性 UnboundLocalError 没有该局部 ...

  5. 老男孩python学习自修第十七天【装饰器】

    装饰器:在某个方法执行前后去执行其他新定义的行为 例如: #!/usr/bin/env python # _*_ coding:UTF-8 _*_ def before_say_hello(): pr ...

  6. 老男孩python学习自修第十六天【常用模块之sys和os】

    例子: sys.argv 命令行参数List,第一个元素是程序本身路径 sys.exit(n) 退出程序,正常退出时exit(0) sys.version 获取Python解释程序的版本信息 sys. ...

  7. 老男孩python学习自修第十五天【常用模块之time】

    例如: #!/usr/bin/env python # _*_ coding:UTF-8 _*_ import time if __name__ == "__main__": pr ...

  8. 老男孩python学习自修第十四天【序列化和json】

    序列化是使用二进制的方式加密列表,字典或集合,反序列化是解密的过程:序列化开启了两个独立进程进行数据交互的通路 使用pickle进行序列化和反序列化 例如: pickle_test.py #!/usr ...

  9. 老男孩python学习自修第十三天【md5加密】

    示例代码如下: hashlib_test.py #!/usr/bin/env python # _*_ coding:UTF-8 _*_ import hashlib def genPasswd(na ...

随机推荐

  1. 【ES6】let 命令

    let命令 为es6新增命令,用来声明变量,类似于var,但是let所声明的变量,只在let命令所在的块级作用域内有效 块级作用域写法(ES6块级作用域允许任意嵌套): // 块级作用域写法 { le ...

  2. 007_Python中的__init__,__call__,__new__

    __init__函数 当一个类实例被创建时, __init__() 方法会自动执行,在类实例创建完毕后执行,类似构建函数.__init__() 可以被当成构建函数,不过不象其它语言中的构建函数,它并不 ...

  3. python flask里 post请求,JSON数据获取方式总结

    #!flask/bin/python #encodig=utf-8 # _*_ coding:utf-8 _*_ # Writer : byz # dateTime : 2016-08-05 from ...

  4. falcon常用参数解析

    CPU.xxx cpu.idle cpu.idle表示除硬盘IO等待时间以外其它等待时间,这个值越大,表示cpu越空闲,还可以执行更多的任务,反之亦然,此处我们falcon展示的是idle的波动情况, ...

  5. mysql从5.5直接升级到5.7后,执行mysql_upgrade速度很慢且执行结束后数据目录大小增加一倍及 mysqlpump备份出现1577错误

    mysql官网不支持夸大版本升级,比如跳过5.6直接升级到5.7,但由于一些客观原因,项目需要从5.5直接升级到5.7,以下是具体操作 1.备份之前mysql,(数据量少,可直接拷贝安装目录及data ...

  6. oracle impdp将导出用户的所有对象导入至另一个用户下,生成的触发器语句问题处理

    问题产生的操作步骤及详细说明: 1)操作的数据库是oracle 11g,先通过命令将用户GAS_NEW的数据导出,命令语句如下: expdp GAS_NEW/GAS_NEW@ORCL schemas= ...

  7. 深入浅出Redis05-Redis集群环境的配置

    一.安装redis 1,下载redis最新版 从以下redis地址下载最新版本的redis,使用使用redis-3.2.9.tar版本. http://download.redis.io/releas ...

  8. Java多线程学习(四)---控制线程

    控制线程 摘要: Java的线程支持提供了一些便捷的工具方法,通过这些便捷的工具方法可以很好地控制线程的执行 1. join线程控制,让一个线程等待另一个线程完成的方法 2. 后台线程,又称为守护线程 ...

  9. Spark SQL在100TB上的自适应执行实践(转载)

    Spark SQL是Apache Spark最广泛使用的一个组件,它提供了非常友好的接口来分布式处理结构化数据,在很多应用领域都有成功的生产实践,但是在超大规模集群和数据集上,Spark SQL仍然遇 ...

  10. 在Winform框架界面中改变并存储界面皮肤样式

    在本篇介绍的Winform界面样式改变及存储操作中,是指基于DevExpress进行界面样式的变化.一般情况下,默认我们会为客户提供多种DevExpress的界面皮肤以供个人喜好选择,默认DevExp ...