面向对象

实例变量 & 类变量

class Role(object):
    # <类变量> = var
    n = 100
    n_list = []
    name = 'hahaha'
    def __init__(self, var):
        # self.<实例变量> = var
        self.name = var

>>>r1 = Role(var='lalala')
>>>r1.name
lalala
>>>Role.name
hahaha

>>>r2 = Role('lex')
>>>r2.n
100
>>>r1.n = 200
>>>r1.n
200
>>>r2.n
100
# 其实在r1的内存里创建了变量 n=200,类变量没动

# r1,r2,Role 都公用一个内存变量 n_list
>>>r1.n_list.append("from r1")
>>>r2.n_list.append("from r2")
>>>r2.n_list
["from r1","from r2"]
>>>Role.n_list
["from r1","from r2"]

析构函数

在实例释放、销毁的时候自动执行
del var 启动 __del__(self)方法
摘掉门牌号,自动回收机制删除内存

私有方法、私有属性

加俩下划线:self.life_value ---> self.__life_value
外界无法直接访问,可以内部定义一个方法访问

类的封装

封装数据的函数是和Student类本身是关联起来的,我们称之为类的方法。

简单的说,将外部函数内部化为类的方法,就是封装。

新式类 & 经典类

"""  Author: Dr.Ch  """


# class People:  ## 经典类写法
class People(object):  # 新式类  ## object是个基类

    def __init__(self, name, age):
        self.name = name
        self.age = age

    def eat(self):
        print("%s is eating..." % self.name)

    def talk(self):
        print("%s is talking..." % self.name)

    def sleep(self):
        print("%s is sleeping..." % self.name)


class Relation(object):  # 给人加上社交属性

    def make_friends(self, obj):  # obj 是 其他人,尚未实例化的
        print("%s is making friends with %s" % (self.name, obj.name))


class Man(People, Relation):  # 注释1

    # 为了增加子类属性,需要重构 __init__()
    def __init__(self, name, age, money):  # 增加属性:男人出生就有钱
        # 把父类的属性拿过来
        People.__init__(self, name, age)  # 经典类写法
        self.money = money
        print("%s 一出生就有 %s money" % (self.name, self.money))

    def whoring(self):  # 定义子类新方法
        print("%s is whoring..." % self.name)

    def sleep(self):
        print("man is sleeping...")  # 更改父类方法

    def talk(self):
        People.talk(self)  # 直接调用父类方法

    def eat(self):
        People.eat(self)
        print("man is eating...")  # 在父类方法上增加新功能


class Woman(People, Relation):

    def __init__(self, name, age, height, big_breast=True):
        # 另一种高级的方法继承父类,代替 line32 的语法
        super(Woman, self).__init__(name, age)  # 新式类写法  ## 注释2
        self.height = height
        self.big_breast = big_breast

    def get_birth(self):
        print("%s is born a baby..." % self.name)


print("\n--------- 多继承 -----------")
m3 = Man("Jon", 25, 2000)
w3 = Woman("Maria", 22, 170, False)
m3.make_friends(w3)

print("\n--------- women -----------")
w1 = Woman("alex", 22, 162)
w1.get_birth()

print("\n--------- men -----------")
m1 = Man("lex", 23, 20)
m1.whoring()
m1.sleep()
m1.talk()
m1.eat()

print("\n--------- men 继承 -----------")
m2 = Man("clark", 24, 100)

print("\n--------- women 继承 -----------")
w2 = Woman("lana", 21, 165)


"""
注释1:Man的实现 先在Man里面执行__init__()生成 name ,再继承Relation的方法,所以name已经有了
       不是在People里面执行__init__(),所以 Man(People,Relation)继承顺序无影响。
       如果没有自己的构造方法,应该去执行父类的__init__(),然而依然没有报错(Relation,People),
       因为make_friends()还没有执行。
       ……总之按照从左到右顺序继承。(见视频30分钟处)
       对象生成,先实例化,多继承的时候,从左到右: SubClass(Class1,Class2,...,ClassN):
       先执行 SubClass 的 构造函数__init__(),如果没有构造函数,则
       执行 Class1 的 构造函数,如果 Class1 也没有 构造函数,则
       执行 Class2 的 构造函数,…… 以此类推。重点是,只继承一个就结束。
       
       —— 关于广度优先、深度优先见视频6.9 10分钟左右——(面试必备)
       A,B(A),C(A),D(B,C)
       py2 是深度优先:D先继承B,再继承A,最后继承C
       py3 经典类和新式类都是统一按照广度优先来继承的:D先继承B,再继承C,最后继承A

注释2:与 People.__init__(self, name, age) 相比优点在于,
       super(Woman,self).__init__(name, age) 不用写父类名 People,
       如果有一天 People 名字改了,只需要改一次 line50 处
       另外,有利于多继承。
       经典类 和 新式类 区别主要体现在 多继承 上。
"""
--------- 多继承 -----------
Jon 一出生就有 2000 money
Jon is making friends with Maria

--------- women -----------
alex is born a baby...

--------- men -----------
lex 一出生就有 20 money
lex is whoring...
man is sleeping...
lex is talking...
lex is eating...
man is eating...

--------- men 继承 -----------
clark 一出生就有 100 money

--------- women 继承 -----------

Process finished with exit code 0

静态方法

@staticmethod 静态方法 跟 类 的关系切断了,变成了普通的函数
唯一与类的关联就是,如果要调用,必须通过类名(实例名)调用
普通的 类的方法 需要传入self参数。
(如果非要传self参数,需要再把实例传进去,这就失去静态方法的意义了)
用处:把类变成一个工具包组合。

类方法

@classmethod 类方法只能访问类变量,不能访问实例变量(似乎没怎么用过)
场景:强制使用类属性,实例变量改了没用,比如禁止改国籍。

属性方法

@property 导致方法不可调用
效果:把一个方法变成一个静态属性,不再可以加()调用,不能传参数了
作用:隐藏实现细节,只给用户输出结果。






查看类方法的说明文档

import pandas as pd
df = pd.DataFrame(data)
# 查看DataFrame类在哪个模块里:
>>>df.info()
>>>
<class 'pandas.core.frame.DataFrame'>...
# 查看info()方法说明文档:
print(pd.DataFrame.info.__doc__)

df 的各种操作

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

推荐阅读更多精彩内容

  • 初识面向对象 楔子 你现在是一家游戏公司的开发人员,现在需要你开发一款叫做<人狗大战>的游戏,你就思考呀,人狗作战...
    go以恒阅读 913评论 0 6
  • 抽象类 什么是抽象类 与java一样,python也有抽象类的概念但是同样需要借助模块实现,抽象类是一个特殊的...
    go以恒阅读 597评论 0 3
  • Python 面向对象 Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个...
    今早上阅读 512评论 0 0
  • 江南救世阅读 1,254评论 0 0
  • “那么,你现在确定了么?” “确定了,你猜猜这回我过了多少年?” 他这个问题还真勾起了我兴趣,也是我来这里最主要的...
    71d549cf95f3阅读 323评论 0 1