设为首页 收藏本站
查看: 891|回复: 0

[经验分享] Python基础,面向对象

[复制链接]

尚未签到

发表于 2017-10-23 14:14:11 | 显示全部楼层 |阅读模式
                      几个名词知识:

类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。

类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。

实例变量:定义在方法中的变量,只作用于当前实例的类。

数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据。

方法:类中定义的函数。

方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。

继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是模拟"是一个(is-a)"关系(例图,Dog是一个Animal)。

实例化:创建一个类的实例,类的具体对象。

对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。


类定义语法格式如下
1
2
3
4
# E:\Python36
# coding=GBK
class classname:
    script……



类实例化后,可以使用其属性,实际上,创建一个类之后,可以通过类名访问其属性。
类对象支持两种操作:属性引用和实例化。
例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# E:\Python36
# coding=GBK
#类定义
class people:
    #定义基本属性
    name = ''
    age = 1
    def f(self):
        return 'hello world'

# 实例化类
b = people()

# 访问类的属性和方法
print("people类的属性age为:", b.age)
print("people类的方法f输出为:", b.f())



执行以上程序输出结果为:

people类的属性age为: 1
people类的方法f输出为: hello world

定义类的时候是可以定义为一个可以初始化的类,因此类可能会定义一个名为 __init__() 的特殊方法(就是所谓的构造方法),类的实例化操作会自动调用 __init__() 方法。

当然, __init__() 方法可以有参数,参数通过 __init__() 传递到类的实例化操作上。

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# E:\Python36
# coding=GBK
#类定义
class people:
    #定义基本属性
    name = ''
    age = 0
    #定义构造方法,用于初始化
    def __init__(self,n,a):
        self.name = n
        self.age = a
        
if __name__ == '__main__':
    #实例化
    p = people('jack',25)
    p.speak()



输出结果为:jack 12


类的方法

在类地内部,使用def关键字可以为类定义一个方法,与一般函数定义不同,类方法必须包含参数self,且为第一个参数:

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# E:\Python36
# coding=GBK
#类定义
class people:
    #定义基本属性
    name = ''
    age = 0
    #定义构造方法,用于初始化
    def __init__(self,n,a):
        self.name = n
        self.age = a
    def speak(self):
        print("我叫%s,今年%d岁!" %(self.name,self.age))

p = people('jack',25)
p.speak()



执行代码输出结果:我叫jack,今年25岁了!

继承
在这里我应用了模块,模块就是一个包含所有你定义的函数和变量的文件,其后缀名是.py。模块可以被别的程序引入,以使用该模块中的函数等功能。
写一个类(student)来继承类(people),people应用模块引入的方式,如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# E:\Python36
# coding=GBK

#引入模块
from class_people import people as p
#单继承示例,继承people
class student(p):
    grade = ''
    def __init__(self,n,a,g):
        #调用父类的构函
        p.__init__(self,n,a)
        self.grade = g
    #如果父类的方法满足不了需求则重写父类的方法
    def speak(self):
        print("不对现在%d岁了,我在读%s年级"%(self.age,self.grade))

s = student('jack',26,'大学三')
s.speak()



执行代码输出结果为:

我叫jack,今年25岁!
不对现在26岁了,我在读大学三年级

多继承
这里再增加一个类


这里有用到了一个知识点:__name__属性
一个模块被另一个程序第一次引入时,其主程序将运行。如果我们想在模块被引入时,模块中的某一程序块不执行,我们可以用__name__属性来使该程序块仅在该模块自身运行时执行。
例如:
1
2
3
4
5
6
7
8
9
10
11
class_people people p
speaker(p):
    topic = (,n,a,t):
        p.(,n,a)
        .topic = t
    speak():
        (%(.name,.age,.topic))

__name__ ==:
    s = speaker(,,)
    s.speak()



下面我们来写一个多继承的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# E:\Python36
# coding=GBK

from class_student import student as t
from  class_speaker import speaker as s
# 多继承,继承学生和演说家
class sample(t,s):
    a =''
    def __init__(self,n,a,g,t1):
        t.__init__(self,n,a,g)
        s.__init__(self,t1)
    # 重写父类方法
    def speak(self):
        print("暑假过后就是%s了,我还是一个演说家,我今天演讲的主题是%s"%(self.grade,self.topic))

test = sample("jack",26,'大四',"Python")
test.speak()   #方法名同,默认调用的是在括号中排前地父类的方法



执行代码,运行结果为:
我叫jack,今年25岁了!
不对现在26岁了,我在读大学三年级
暑假过后就是大四了,我还是一个演说家,我今天演讲的主题是Python

有结果我们可以看出,类class_speaker中的方法并没有运行,因此每个模块都有一个__name__属性,当其值是'__main__'时,表明该模块自身在运行,否则是被引入。
                  


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-405754-1-1.html 上篇帖子: 使用python实现统计Nginx进程所占用的物理内存 下篇帖子: 使用py-mysql2pgsql 简单实现mysql数据库迁移到pgsql
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表