面向对象的编程

面向对象是一种编写代码的思维方式:程序是由什么构成的
类,其实是一种抽象······
user类:是把用户相关信息抽象到一起

  • 类名采用驼峰结构,并且首字母大写。

一般来说,类由属性和行为(方法)组成

  • 属性表示了这个类的特点,行为(方法)规定了这个类的功能
  • 程序(类)=数据结构(属性)+算法(行为、方法)

类->实例:实例是类的具体化

self指的是:当前对象(方法的调用者)

class Cat:
    '''
    构造方法,该方法会在创建对象(实例)的时候,自动调用
    '''
    def __init__(self,color,name):
        '''
        函数定义在类里叫做方法
        :param color:
        :param name:
        '''
        self.color=color
        self.__name=name


    def catchRat(self):
        print(self.__name+'抓到了老鼠')

#创建一个实例
#实例化对象的过程:1、分配内存出来(__new__) 2、初始化值(__init__)
tom=Cat('Blue','Tom')
tom.catchRat()
#私有属性
print(tom.name)
tom.name='JiaFeiCat'
print(tom.name)

属性私有化

1、两个下划线开头 2、自己约定_单下划线

双下划线为什么能够隐藏变量?dict里面装的是实例的所有属性
双下划线开头的属性会被转换成类名_属性名,所以查不到
print(tom.dict)

class Student:
    def __init__(self,name,age):
        self.__name=name
        self.__age=age

    def set_name(self,name):
        if not len(name)<3:
            self.__name=name
    def get_name(self):
        return self.__name

    @property
    def age(self):
        return self.__age

    @age.setter
    def age(self,age):
        if age>0 and age<100:
            self.__age=age

s=Student('zhangsan',20)
#提供了get、set方法
print(s.get_name())
s.set_name('lisi')
print(s.get_name())

s.age=50
print(s.age)

类也是一个对象

self.属性名:实例属性
在类里直接定理的属性叫做类属性,类属性由所有对象共享

class User:
    num=0
    def __init__(self,name):
        self.name=name
        User.num+=1

    def print_name(self):
        print(self.name,User.num)

    @classmethod
    def creat_user(cls,name,age):
        # print(cls)
        user=cls(name)
        user.age=age
        # print(user)
        return user
    @staticmethod
    def sum(a,b):
        return a+b

    def __str__(self):
        return self.name
u=User('zs')
u.print_name()
u1=User('ls')
u1.print_name()

u2=User.creat_user('zs',20)
print(u2.age)
print(u2.name)
print(User.sum(2,3))
  • @classmethod 修饰的方法是类方法,类方法可以通过类名调用,类方法必须有一个类型参数:cls
  • @statemethod 修饰的方法是静态方法,通过类名可以访问,仿作普通函数来用

模拟一个游戏,有一个怪兽(monster),还有一个玩家(hero)

import  random as rn
class Sprite:
    def __init__(self,name):
        self.blood=100
        self.power=12
        self.name=name
    def attack(self,monster):
        minus=rn.randrange(self.power-5,self.power+5)
        if monster.has_living():
            monster.minus_blood(minus)
        print(monster.name+':'+str(monster.blood))

    def minus_blood(self, num):
        self.blood -= num

    def has_living(self):
        if self.blood>0:
            return True
        return False

m=Sprite('哥斯拉')
h=Sprite('奥特曼')
while m.has_living() and h.has_living():
    m.attack(h)
    h.attack(m)

继承

python支持多继承,继承内容与继承顺序相关
所有的类,都会默认继承object类

class A:
    def __init__(self):
        self.name='A'

    def print_test(self):
        print('aaaaa')
class B:
    def __init__(self):
        self.name='b'

class C(A,B):
    def __init__(self):
        super().__init__()
        self.age=20
    def print_test(self):
        super().print_test()
        print('bbbbbb')
c=C()
print(c.name)
print(c.age)
#调用属性或者方法的查找顺序
# print(c.__mro__)
c.print_test()

组合

组合优于继承

class D:
    def __init__(self):
        self.a=A()

    def print_test(self):
        self.a.print_test()
        print('ddddd')

d=D()
d.print_test()

鸭子类型

叫起来像鸭子,走起来像鸭子,那他就是鸭子

class Programer:
    def dowork(self):
        print('biancheng')

class Manager:
    def dowork(self):
        print('guanli')

employer=Manager()
employer.dowork()

使用继承写游戏

class Hero(Sprite):
    def bug_attack(self,monster):
        monster.minus_blood(monster.blood)

    def attack(self,monster):
        super().attack(monster)
        num=rn.randint(0,3)
        if num==1:
            print(self.name+'使用了道具')
            self.bug_attack(monster)

h=Hero('奥特曼')
m=Sprite('哥斯拉')
while m.has_living() and h.has_living():
    m.attack(h)
    h.attack(m)

单例模式:一个类只能有一个对象

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

推荐阅读更多精彩内容