Python面向对象

1.定义一个类

老式类

1.1老式类与新式类:

image.png

1.2两个内建函数:

dir():返回对象的属性 type():返回对象的类型

1.2.1对比代码:

输出两个类的属性和类型


输出两个类的属性和类型

1.2.2结果:

新式类多了很多内置属性

2.定义类的属性

2.1直接在类里定义:

属性被所有实例共享

2.2在构造函数里定义:

为每一个实例赋各自的值

3.访问控制:

尴尬

name-->公有的;_age-->私有的;__weight-->也是私有的(类外不可访问,但有例外)

例子

输出

用最后一个输出语句可以访问双下滑线的所谓的私有属性
双下滑线的属性,python会把它的名字改一下而已,并没有进行真正的进行访问控制


4.定义类的方法

在python中一切皆对象
类的方法也是类的属性


把一个方法改成了一个字符串

4.1方法的访问控制

也是没有

image.png

4.2特殊的装饰器

感觉就像java的静态方法

可怕

4.2.1一个例子

上面没显示的代码和前面的代码一样

结果

5.类的继承

5.1定义类的继承

class DerivedClassName(BaseClassName):
    <statement-1>
    ·
    ·
    ·
    <staement-N>

5.1.1继承的子类:

  • 会继承父类的属性和方法
  • 也可以自己定义,覆盖父类的属性和方法

5.1.2用super()调用父类的方法

class A(object):
    def method(self,arg):
        pass

class B(A):
    def method(self, arg):
        super(B, self).method(arg)

或者直接调用,但这样体现不出来继承

class A(object):
    def method(self, arg):
        pass

class B(A):
    def method(self, arg):
        A.method(arg)

5.1.3子类的类型判断

两个方法

  • isinstance - 判断类型
  • issubclass - 判断是否是子类

5.2多继承

class DerivedClassName(Base1, Base2, Base3):
    <statement-1>
    ·
    ·
    ·
    <statement-N>

5.3实例代码

#coding:utf-8
class Programer(object):# 定义了一个父类
    hobby = 'Play Computer'

    def __init__(self, name, age, weight):
        self.name = name
        self._age = age
        self.__weight = weight

        @classmethod
        def get_hobby(cls):
            return cls.hobby

        @property
        def get_weight(self):
            return self.__weight

        def self_introduction(self):
            print 'My Name is %s \nI am %s years old\n' % (self.name, self._age)

class BackendProgramer(Programer):# 定义子类继承父类

    def __init__(self, name, age, weight, language):
        super(BackendProgramer, self).__init__(name, age, weight)
        self.language = language

if __name__ == '__main__':

    programer = BackendProgramer('Albert', 25, 80, 'Python')
    print dir(programer)# 打印对象的属性
    print programer.__dict__
    print type(programer)# 打印对象的类型
    print isinstance(programer, Programer)# 判断programer是否为Programer的子类



运行结果:

['_Programer__weight', '__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_age', 'hobby', 'language', 'name']
{'_age': 25, '_Programer__weight': 80, 'name': 'Albert', 'language': 'Python'}
<class '__main__.BackendProgramer'>
True



6.类的多态

6.1多态的要素

  • 继承
  • 方法重写

6.2实例代码

# coding:utf-8
class Programer(object):
    hobby = 'Play Computer'

    def __init__(self, name, age, weight):  # 构造方法
        self.name = name
        self._age = age
        self.__weight = weight

    @classmethod
    def get_hobby(cls):
        return cls.hobby

    @property
    def get_weight(self):
        return self.__weight

    def self_introduction(self):
        print 'My Name is %s \nI am %s years old\n' % (self.name, self._age)


class BackendProgramer(Programer):

    def __init__(self, name, age, weight, language):
        super(BackendProgramer, self).__init__(name, age, weight)
        self.language = language

    def self_introduction(self):
        print 'My name is %s \nMy favorite language is %s' % (self.name, self.language)


def introduce(programer):
    if isinstance(programer, Programer):
        programer.self_introduction()


if __name__ == '__main__':

    programer = Programer('Albert', 25, 80,)
    backend_programer = BackendProgramer('Tim', 30, 70, 'Python')
    introduce(programer)
    introduce(backend_programer)


结果:

My Name is Albert 
I am 25 years old

My name is Tim 
My favorite language is Python



7.Magic Method

7.1Magic Method 长什么样

方法名的前后有两个下划线

def __init__(self):

7.2对象实例化的过程

  创建类的对象       --->      初始化对象
def __new__(cls)          def __init__(self):

# coding:utf-8
class Programer(object):
    hobby = 'Play Computer'

    def __new__(cls, *args, **kwargs):
        print 'call __new__ method'
        print args
        return super(Programer, cls).__new__(cls, *args, **kwargs)

    def __init__(self, name, age):  # 构造方法 # 这个注释距离代码两格#号距离注释一格
        print 'call __init__ method'
        self.name = name
        self._age = age


if __name__ == '__main__':

    programer = Programer('Albert', 25)
    print programer.__dict__


结果:

call __new__ method
('Albert', 25)
call __init__ method
{'_age': 25, 'name': 'Albert'}

7.2.1回收

__del__()


8.类与运算符

>>> s == 'test'
>>> s== s
True
>>>dir(s)
['__add__',  '__class__', '__contains__', '__delattr__', '__doc__', '__eq__' ...]

比较运算符

__cmp__(self, other) # 所有比较
__eq__(self, other) # 等于
__lt__(self, other) # 小于
__gt__(self, other) # 大于


__add__(self, other) # 加
__sub__(self, other) # 减
__mul__(self, other) #  乘
__div__(self, other) # 除

逻辑运算符

__or__(self, other) # 或
__and__(self, other) # 和

例子:

# coding:utf-8
class Programer(object):

    def __init__(self, name, age):  # 构造方法
        self.name = name
        if isinstance(age, int):
            self.age = age
        else:
            raise Exception('age must be int')

    def __eq__(self, other):
        if isinstance(other, Programer):
            if self.age == other.age:
                return True
            else:
                return False
        else:
            raise Exception('The type of object must be Programer')

    def __add__(self, other):
        if isinstance(other, Programer):
            return self.age + other.age
        else:
            raise Exception('The type of object must be Programer')


if __name__ == '__main__':

    p1 = Programer('Albert', 25)
    p2 = Programer('Bill', 30)
    print p1 == p2
    print p1 + p2

结果:

False
55

9.类的展现

转换为字符串

__str__ -- 把对象转换成人容易看的字符串
__repr__ -- 把对象转换成机器容易看的字符串
__unicode__

例子:

# coding:utf-8
class Programer(object):

    def __init__(self, name, age):  # 构造方法
        self.name = name
        if isinstance(age, int):
            self.age = age
        else:
            raise Exception('age must be int')

    def __str__(self):
        return '%s is %s years old' % (self.name, self.age)

    def __dir__(self):
        return self.__dict__.keys()


if __name__ == '__main__':

    p = Programer('Albert', 25)
    print p
    print dir(p)


结果:

Albert is 25 years old
['age', 'name']

可以通过魔术方法给属性设置访问控制

__setattr__(self, name, value):

错误示范:

def __setattr__(self, name, value):
    setattr(self, name, value)  # 无限循环

def __setattr__(self, name, value):
    self.__dict__[name] = value  # 正确用法

查询对象属性

__getattr__(self, name);
__getattribute__(self, name):

删除对象属性

__delattr__(self, name):

例子:

# coding:utf-8
class Programer(object):

    def __init__(self, name, age):  # 构造方法
        self.name = name
        self.age = age

    def __getattribute__(self, name):
        # return getattr(self, name) # 无限循环
        # return self.__dict__[name] # 无限循环
        return super(Programer, self).__getattribute__(name) # 正确写法

    def __setattr__(self, name, value):
        # setattr(self, name, value) # 无限循环
        self.__dict__[name] = value # 正确写法


if __name__ == '__main__':

    p = Programer('Albert', 25)
    print p.name


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

推荐阅读更多精彩内容

  • Python 面向对象Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对...
    顺毛阅读 4,211评论 4 16
  • Python 面向对象 Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个...
    今早上阅读 516评论 0 0
  • AI人工智能技术近几年发展得如火如荼,而随着深度学习技术的成熟,AI也正在逐步从尖端技术慢慢变得普及,AI目前已经...
    AIOPstack阅读 1,842评论 1 3
  • 1.鉴于目前AI比较流行,特别针对JAVA调用腾讯AI接口进行封装,工具中主要包含几个工具类, 1,配置腾讯AI的...
    发光的鱼阅读 2,649评论 0 1
  • 昨天去看了电影《冈仁波齐》,据说这是一部讲修行的片子。 生命是否注定是一趟朝圣之旅,要有这样一趟?从他们踏上路,第...
    自由心空阅读 784评论 1 1