第十五天 python的类

来源:互联网 发布:战地2网络账号 编辑:程序博客网 时间:2024/06/11 09:55

Python是一门面向对象的语言,对于面向对象语言来说,最重要的概念就是类(Class)和实例(Intance),所以python在创建一个类或者一个对象时很容易的,本章我们将要=详细介绍python的面向对象。

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

1、类一般形式

创建类我们一般用class关键字来创建一个类,class后面跟类名字,可以自定义,最后以冒号结尾,如下所示:

class ClassName:

   '''类的说明'''

类的内容

类的内容可以写类的全局变量,方法等


class ren(object):  #object是一个超级类,默认会继承    "'this class is abort ren class"    name = 'meizi'    sex = 'F'    def hello(self):        print('hello world!')a = ren()print(type(a))print(a.name)print(a.sex)a.hello()a.name = 'hanmeimei'print('@@@@@@@@@@@@@@@@@@@@@@@@@@@@@')print(a.name)


2、类的构造


__init__ 构造函数,在生成对象时调用。由于类可以起到模板的作用,因此,可以在创建实例的时候,把一些我们认为必须绑定的属性强制填写进去。通过定义一个特殊的__init__方法,在创建实例的时候,就把name,score等属性绑上去:

classStudent(object):

 

    def __init__(self, name, score):

        self.name = name

        self.score = score

注意到__init__方法的第一个参数永远是self,表示创建的实例本身,因此,在__init__方法内部,就可以把各种属性绑定到self,因为self就指向创建的实例本身。

 

有了__init__方法,在创建实例的时候,就不能传入空的参数了,必须传入与__init__方法匹配的参数,但self不需要传,Python解释器自己会把实例变量传进去:

class ren():#不写object,也会默认继承    def __init__(self, name, sex):#这里是init        self.name = name        self.sex = sex    def hello(self):        print('hello {0}'. format(self.name))#hello后面用的是{}大括号test = ren('lilei', 'M')test.hello()



3、类的继承

继承,顾名思义就知道是它的意思,举个例子说明:你现在有一个现有的A类,现在需要写一个B类,但是B类是A类的特殊版,我们就可以使用继承,B类继承A类时,B类会自动获得A类的所有属性和方法,A类称为父类,B类陈为子类,子类除了继承父类的所有属性和方法,还可以自定义自己的属性和方法,大大增加了代码的复用性。

在我们本章的第一节中,我们可以继承了object类,object类是所有类的父类,所有的类都默认继承object类,它是一个超级类,如果不写,默认继承object。

继承类的格式:

class A(父类):

       …

Python的类支持多继承,而java没有多继承,但是可以有多接口的实现python的多继承很简单,下面我们来看一下多继承的格式:

class A:        # 定义类 A

.....

 

class B:         # 定义类 B

.....

 

class C(A,B):   # 继承类 A 和 B

.....

class A(object):    passclass B(object):    passclass C(A, B): #在后面填写对应的类的名称即可实现多个类的继承(python独有),    pass



多继承其实在需要在父类的位置,直接写多个父类就可以,然后用“,”分开就可以了,C类就同时继承了A类和B类。

Python类的继承注意事项:

1.     在继承中类的构造(__init()方法)不会自动调用,它需要在子类的构造中亲自调用。

2.     Python总是首先子类中的方法,如果子类没有找到,才回去父类中查找。


class parent(object):    name = 'parent'    sex = 'F'    def __init__(self):        print('my name is {0}'.format(self.name))    def get_name(self):        return self.name    def get_sex(self):        return self.sexclass child(parent):    name = 'child'#这里调用了父类中的数据,但子类中有同样的,对其进行重写;编程子类的    # sex = 'M'#这里因为已经注释,故直接调用了父类中的相关    def __init__(self):        print('my name is {0}'.format(self.name))    def hello(self):        print('hello world')a = child()a.hello()print(a.get_name())print(a.get_sex())


类的重写

如果子类没有定义__init__()方法,子类初始化的时候就会调用父类的方法,但是当子类定义了__init__()方法,子类就不会调用父类的__init__()方法,那如果子类想实现父类构造器中的方法,然后自己在写自己特殊的方法呢,这样该怎么办呢?


class parent(object):    name = 'parent'    age = 86    def __init__(self):        print('my dad is baba')    def get_name(self):        return self.name    def get_age(self):        return self.age#因为使用super,所以未执行class child(parent):    def __init__(self):        super(child, self).__init__()#直接调用父类中的参数,如果所调用的父类参数中存在ruturn会直接屏蔽不在执行,而是执行子类下一句;因为子类中同样使用了init,所以调用父类“建议”通过super来进行        print('my name is clild')    def hello(self):        print('hello child')    # def get_age(self):    #     super(child, self).get_age()    #     print('my age is')a = child()a.hello()print(a.get_name())print(a.get_age())


class parent(object):    name = 'parent'    age = 86    def __init__(self):        print('my dad is baba')    def get_name(self):        return self.name    def get_age(self):        return self.age#因为使用super,所以未执行class child(parent):    def __init__(self):        # super(child, self).__init__()#直接调用父类中的参数,如果所调用的父类参数中存在ruturn会直接屏蔽不在执行,而是执行子类下一句;因为子类中同样使用了init,所以调用父类“建议”通过super来进行        print('my name is clild')    def hello(self):        print('hello child')    def get_age(self):        super(child, self).get_age()        print('my age is')a = child()a.hello()print(a.get_name())print(a.get_age())#这里的结果打印出来是none



这时候就出现了子类调用父类的__init__()的方法,

注意:

这里在class parent(object):定义父类的时候,一定要写继承object类,不然那就会有如下的报错信息:TypeError: super() argument 1 must be type, not classobj,增加parent(object)就可以轻松解决。


4、类的私有变量和私有方法

在Python中可以通过在属性变量名前加上双下划线定义属性为私有属性

特殊变量命名

 

1、 _xx 以单下划线开头的表示的是protected类型的变量。即保护类型只能允许其本身与子类进行访问。若内部变量标示,如: 当使用“from M import”时,不会将以一个下划线开头的对象引入 。

 

2、 __xx 双下划线的表示的是私有类型的变量。只能允许这个类本身进行访问了,连子类也不可以用于命名一个类属性(类变量),调用时名字被改变(在类FooBar内部,__boo变成_FooBar__boo,如self._FooBar__boo)

 

3、 __xx__定义的是特列方法。用户控制的命名空间内的变量或是属性,如init , __import__或是file 。只有当文档有说明时使用,不要自己定义这类变量。 (就是说这些是python内部定义的变量名)

 

在这里强调说一下私有变量,python默认的成员函数和成员变量都是公开的,没有像其他类似语言的public,private等关键字修饰.但是可以在变量前面加上两个下划线"_",这样的话函数或变量就变成私有的.这是python的私有变量轧压(这个翻译好拗口),英文是(private name mangling.) **情况就是当变量被标记为私有后,在变量的前端插入类名,再类名前添加一个下划线"_",即形成了_ClassName__变量名.**

 

class a(object):    _name='大师兄'    __sex='M'    def hello(self):        print(self._name)        print(self.__sex)    def get_sex(self):        return self.__sexb=a()print(b._name)print(b.__sex)#实例后,不能访问__sex私有成员,实例不能访问。print (b.get_sex())
执行截图



class a(object):    _name='大师兄'    __sex='M'    def hello(self):        print(self._name)        print(self.__sex)    def get_sex(self):        return self.__sexb=a()print(b._name)# print(b.__sex)#实例后,不能访问__sex私有成员,实例不能访问。print (b.get_sex())





Python内置类属性

__dict__ : 类的属性(包含一个字典,由类的数据属性组成)

__doc__ :类的文档字符串

__module__: 类定义所在的模块(类的全名是'__main__.className',如果类位于一个导入模块mymod中,那么className.__module__等于 mymod)

__bases__ : 类的所有父类构成元素(包含了一个由所有父类组成的元组)


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 头发又细又软又少怎么办 宝宝一岁了头发又少又黄怎么办 生完孩子头发掉的厉害怎么办 洗完头发后头发很蓬松怎么办 头发掉的厉害怎么办吃什么好得快 头发掉的很厉害怎么办吃什么好 我头发掉的厉害怎么办吃什么药 头发干枯毛躁掉发怎么办吃什么 最近洗头时头发掉的厉害怎么办 生完小孩头发掉的厉害怎么办 生完小孩后头发掉的厉害怎么办 生完孩子后严重掉头发怎么办 生过孩子后掉头发严重怎么办 孩孑16岁了高中没考上怎么办 小孩的嘴巴里有点点该怎么办 小孩从出生哭笑嘴巴有点歪怎么办 儿童耳朵受伤后嘴巴歪了怎么办 手机锁屏图案忘了怎么办求解锁 忘给仓鼠买吃的了怎么办 两岁宝宝不爱吃饭只喝奶粉怎么办 下载百度云压缩包要提取密码怎么办 微信表情包图片过大无法添加怎么办 管理员吧群员全部踢了群主怎么办 微信笑脸表情斗图文字没有了怎么办 钨珠钢笔头用完笔墨了怎么办 暴走大事件被禁六一红鼻子节怎么办 弯腰推东西把腰闪了怎么办 怀孕初期弯腰捡东西腰不舒服怎么办 突然弯腰捡东西腰闪了怎么办 跑步机上的磁铁掉了怎么办 微信解封辅助申诉信息不一致怎么办 穿越火线进游戏字体变小了怎么办 微信登录显示版本过低登不上怎么办 手机显示主题版本过低不能用怎么办 杨豹平全民k歌qq登不上去怎么办 画画时桌面会有许多橡皮渣怎么办 瑜伽体式小人图大全不会画怎么办 微信公众号的字体变得不认识怎么办 三菱按动笔摔了一下断墨怎么办 员工工作一星期不到不给工资怎么办 毕业后报到证一直没去报道怎么办