面向对象的编程

面向对象是一种编写代码的思维方式:程序是由什么构成的
类,其实是一种抽象······
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))
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容