2018-07-31Python (11)

python 基础语法(11)

面向对象

概念

面向对象最重要的概念就是类和实例,类是实例的抽象,而实例是类的具象化。

定义类

  1. 类的关键字class(注意是小写)
  2. 类的名称(首字母大写)
  3. 继承的父类,所有类默认都继承于object,可以省略不写。
  4. 类的初始化函数 init(),在类实例化为对象时会默认调用该方法。

代码实例:

class User(object):
    def __init__(self,id,sno,name,password):
        self.id = id
        self.sno = sno
        self.name = name
        self.password = password

类的方法

  1. 析构函数del()
    init()相对应,它会在删除对象或是系统回收对象时自动调用

  2. instance(obj, Employee)
    用来判断obj是否为Emoloyee类型,但是判断不够准确,即当判断一个子类的实例时会返回True,当判断这个实例是否为它父类的实例时也会返回True。

继承

类的继承

  1. 在继承关系中,父类的构造方法(init())不会自动调用,它需要在其派生类的构造中亲自专门调用。
  2. 在调用类中的方法时,会首先在类中查找,找不到时在其父类中查找。
  3. python中没有方法的重载,后写的同名方法会覆盖之前的方法。

多重继承

两个类可以同时继承同一个类,一个类也可以同时继承多个类。

经典类的搜索方式是按照“从左至右,深度优先”的方式去查找属性

使用接口的思想设计多重继承

被继承的类主要分为类型类和功能类两种;
类型类实现主体继承树形结构,功能类作为独立的功能接口。
代码实例:

多重继承

class Animal(object):
    def __init__(self,age):
        self.age=age

# 大类:
class Mammal(Animal):
    def __init__(self,age,foot):
        super(Mammal,self).__init__(age)
        self.foot=foot

class Bird(Animal):
    def __init__(self,age,fly):
        super(Bird,self).__init__(age)
        self.fly=fly



class RunnableMixIn(object):
    def run(self):
        print('Running...')

class FlyableMixIn(object):
    def fly(self):
        print('Flying...')

# 各种动物:
class Dog(Mammal,RunnableMixIn):
    def __init__(self,age,foot,gender):
        super(Dog,self).__init__(age,foot)
        self.gender=gender
    def show(self):
        print('dog age is:',self.age,'ang have ',self.foot)

dog=Dog(3,4,'male')

dog.show() 

动态添加属性

在类实例化的时候,可以直接将实例化的对象.新属性,就可以为其动态添加属性,且不会影响到其它对象。
代码实例:

 class Person:
    pass
p1=Person()
p2=Person()
p1.gender='male'
print(p1.gender)
print(p2.gender) #'Person' object has no attribute 'gender'

动态为对象添加方法

这里会导入一个MethodType方法,通过该方法来实现方法的动态添加。

代码实例:

from types import MethodType
class Person:
    pass
def displayMe(self):
    print('my genderis:', self.gender)
# 给一个实例绑定的方法,对另一个实例是不起作用的:
p1.dispalyMe=MethodType(displayMe,p1)
p1.dispalyMe()

动态给类增加属性和方法

通过此手段,可以为所有对象都添加属性和方法。
类添加方法无需使用MethodType方法,直接像属性一样添加即可。

Person.gender='male'
def displayMe(self):
    print('my genderis:', self.gender)
# 注意后面要加一个Person
Person.displayMe=displayMe(Person)  

slots限制实例的属性

例如,只允许对Student实例添加name和age属性。
代码实例:

class Person(object):
    __slots__=('name','age')

p1=Person()
print(dir(p1))
# 这是看到p1对象里已经存在name和age属性了
try:
    p1.gender = 'female'
except Exception:
    print('使用__slots__限制实例的属性')  

删除属性

代码实例:

class Person:
    def __init__(self):
        self.age=1
p1=Person()
p2=Person()
p1.gender='male'

Person.nation='china'

del p1.gender

del p1.nation #error nation属于类的,不可以通过对象删除

del Person.nation

del p1.age #这是可以的   

利用函数动态绑定

代码实例:

#该语句只能添加属性,不能添加方法
setattr(ee2, 'age', 8) # 添加属性 'age' 值为 8
getattr(ee1, 'age')     # 返回 'age' 属性的值
hasattr(ee1, 'age')     # 如果存在 'age' 属性返回 True。
delattr(ee1, 'age')     # 删除属性 'age'

私有属性

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 pub():
    # protected类型的变量和方法 在类的实例中可以获取和调用
    _name = 'protected类型的变量'
    __info = '私有类型的变量'
    def _func(self):
        print("这是一个protected类型的方法")
    def __func2(self):
        print('这是一个私有类型的方法')
    # 如果想要在实例中获取到类的私有类形变量可以通过在类中声明普通方法,返回私有类形变量的方式获取
    def get(self):
        return(self.__info)

p=pub()
p.__info # error 因为__info是私有变量只有在类内部才可见,所以要用内部方法
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 222,104评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,816评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,697评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,836评论 1 298
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,851评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,441评论 1 310
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,992评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,899评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,457评论 1 318
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,529评论 3 341
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,664评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,346评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,025评论 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,511评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,611评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 49,081评论 3 377
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,675评论 2 359

推荐阅读更多精彩内容