python12类

 

 

self 表示类里面的对象的引用

python一般不需要去解决内存管理,解释器会进行自动给回收

#类鱼类之间空格两行,前面的函数里面也是两行,类里面的方法个一行
class Cat(object):
    """
    猫科动物
    """
    def __init__(self,name,age,sex=None):
        #一定要把没用默认值的变量写道前面
        self.name = name
        self.__age = age
        self.sex = sex
    def set_age(self,age):
        """
        变更年龄
        :param age: int 年龄
        """
        self.__age = age
        #return self.__age

    def show_info(self):
        rest ="我叫什么{},今年{}岁,性别是{}".format(self.name,self.__age,self.sex)
        print(rest)
        return rest

    def eat(self):
        print("aaa")
class Dog():
    pass

if __name__ == "__main__":
    cat_blact = Cat("quan",11)
    cat_blact.show_info()
    cat_blact.eat()

    cat_white = Cat("zhi",12,"man")
    cat_white.show_info()

    print(cat_white.name)
    #print(cat_white.__age)#无法访问私有变量,只能通过类内函数
    cat_white.name = "改变名字"
    print(cat_white.name) #不是私有变量可以直接调用改变

    cat_white.set_age(44)
    cat_white.show_info()

    #类的实例是否是该类
    print(isinstance(cat_white,Cat))
    print(isinstance(cat_blact,Cat))
    print(isinstance(cat_blact,Dog))
    print(isinstance(cat_white,Dog))

jieguo:

我叫什么quan,今年11岁,性别是None
aaa
我叫什么zhi,今年12岁,性别是man
zhi
改变名字
我叫什么改变名字,今年44岁,性别是man
True
True
False
False

class BaseCat(object):
    """
    猫科动物的基础类BaseCat
    Tige   Panda  PerCat

    """
    tag = "猫科动物"
    def __init__(self,name):
        self.name = name

    def eat(self):
        """
        猫吃东西
        :return:
        """
        print("猫吃base")


class  Tiger(BaseCat):
    """
    老虎类,猫科动物
    """
    def eat(self):
        super(Tiger,self).eat()
        print("老虎吃肉")



class Panda(BaseCat):
    """
    熊猫也是
    """
    pass


class PerCat(BaseCat):
    """
    家猫类
    """
    def eat(self):
        super(PerCat, self).eat()
        print("家猫吃pet")

class HuaCat(PerCat):
    """
    家猫中的花猫
    """
    def eat(self):
        super(HuaCat, self).eat()
        print("家猫吃hua")

class DuanCat(PerCat):
    """
    短毛
    """
    def eat(self):
        # print("家猫吃duan")
        super(DuanCat, self).eat()


if __name__ == "__main__":
    cat = HuaCat("huahua")
    cat.eat()
    print("+++++++++++++++++++++++++++++")
    #实例化duan猫
    cat_d = DuanCat("duanduan")
    cat_d.eat()

    #子类的判断:
    print(issubclass(DuanCat,BaseCat))
    print(issubclass(HuaCat, BaseCat))
    print(issubclass(HuaCat, PerCat))
    print(issubclass(HuaCat,DuanCat))

注意:
当多重继承的父类存再相同的方法时,按照继承顺序,最先寻找到的方法为执行方法,剩下的即使发现也不会执行
class BaseCat(object):
    """
    猫科动物的基础类BaseCat
    Tige   Panda  PerCat

    """
    tag = "猫科动物"
    def __init__(self,name):
        self.name = name

    def eat(self):
        """
        猫吃东西
        :return:
        """
        print("猫吃base")


class ProtectMinxi(object):
    def protect(self):
        print("我是保护动物")


class ProtectL(object):
    def protect(self):
        print("我是国家级别")


class  Tiger(BaseCat,ProtectMinxi,ProtectL):
    """
    老虎类,猫科动物
    """
    def eat(self):
        super(Tiger,self).eat()
        print("老虎吃肉")


class  Tiger1(BaseCat,ProtectL,ProtectMinxi):
    """
    老虎类,猫科动物
    """
    def eat(self):
        super(Tiger1,self).eat()
        print("老虎吃肉")

if __name__ == "__main__":
    tager1 = Tiger("quan")
    tager1.protect()

    tager2 = Tiger1("zhi")
    tager2.protect()

结果:

我是保护动物
我是国家级别

class BaseCat(object):
    """
    猫科动物的基础类BaseCat
    Tige   Panda  PerCat

    """
    tag = "猫科动物"
    def __init__(self,name):
        self.name = name
        print("Base_init")

    def eat(self):
        """
        猫吃东西
        :return:
        """
        print("猫吃base")


class  Tiger(BaseCat):
    """
    老虎类,猫科动物
    """
    def __init__(self,name,color):
        super(Tiger,self).__init__(name)
        self.color = color
        print("Tiger_init")

    def eat(self):
        super(Tiger,self).eat()
        print("老虎吃肉")

    def show_info(self):
        print("Tiger{},{}".format(self.name,self.color))

if __name__ == "__main__":
    tiger = Tiger("quan","black")
    tiger.show_info()

结果:
Base_init
Tiger_init
Tigerquan,black

class PetCat(object):

    def __init__(self,name,age):
        """
        构造方法
        :param name: 猫的名称
        :param age:  猫的年龄
        """
        self.name = name
        self.__age = age

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

    @age.setter
    def age(self,value):
        if not isinstance(value,int):
            print("年龄必须时整数")
            return 0
        if value <0 or value > 100:
            print("年龄必须介于0-100之间")
            return 0
        self.__age = value
    @property
    def show_info(self):
        return "我叫{0},今年{1}".format(self.name,self.age)

    def __str__(self):
        return "类的描述函数,可以通过直接打印类实例得到"
if __name__ == "__main__":
    cat_balk = PetCat("quan",12)
    cat_balk.age = 6
    rest = cat_balk.show_info
    print(rest)
    print(cat_balk.age)
使用@property装饰器的好处是既可以保护类的封装性,又可以使用“类.属性”来对私有属性进行操作。

使用@property装饰器可以直接通过方法名来访问方法,不需要再在后面使用"()".
使用@property 直接调用 age() 方法,这样就使得该方法变成了 age 属性的 getter 方法,也就是读操作
setter 装饰器:@age.setter,可以对私有属性age的值进行写操作
deleter 装饰器:  @age.deleter,可以对私有属性age的值进行删除操作
注1:另外,私有属性只能在类中使用,且不可访问,目的是保护数据的安全性,以及隐藏核心开发细节。私有属性或私有方法以两个下划线开头。

注2:面向对象有三大特性: 封装,继承,多态

父类的私有方法和私有属性,不会被子类继承
可以通过调用继承的父类的共有方法,间接的访问父类的私有方法、属性
python中用super来使子类继承父类的属性或方法

当父类对变量出现slots的限制,不能再添加新的方法和属性,再子类如果还存在其他的slots语句变量,变量会加载父类后边,
class PetCat(object):

    __slots__ = ("name","age") #加入slots之后不能给实例添加属性和方法
    def __init__(self,name,age):
        """
        构造方法
        :param name: 猫的名称
        :param age:  猫的年龄
        """
        self.name = name
        self.age = age

    @property
    def show_info(self):
        return "我叫{0},今年{1}".format(self.name, self.age)

    def __str__(self):
        return "类的描述函数,可以通过直接打印类实例得到"
class HuaCat(PetCat):
    __slots__ = ("color")#不加是不能添加新的方法和属性的
    pass

def eat():
    print("chichi")
if __name__ == "__main__":
    cat_balk = PetCat("quan",12)
    rest = cat_balk.show_info

    cat_white = HuaCat("zhi",12)
    cat_white.color = "hei"
    print(cat_white.show_info)

class Cat(object):
    tag = "miao"
    def __init__(self,name):
        self.name = name

    @staticmethod
    def breath():
        print("fuxifuxi")


    def show_info(self):
        print("{0}, {1}".format(self.tag,self.name))


if __name__ == "__main__":
    #非实例
    Cat.breath()
    print("QQQQQQQQQQQQQQQQQQQQQQ")
    #需要实例化调用
    cat = Cat("quan")
    cat.breath()
    cat.show_info()

jieguo :
fuxifuxi
QQQQQQQQQQQQQQQQQQQQQQ
fuxifuxi
miao, quan
class Cat(object):
    tag = "miao"
    def __init__(self,name):
        self.name = name

    @staticmethod
    def breath():
        print("fuxifuxi")

    @classmethod
    #后面设计系统的时候会用到的设计模式
    def show_info(cls,name):
        return cls(name)
       # print("{0}, {1}".format(cls.tag,cls.name))

    def show_info2(self):
        print("{0}, {1}".format(self.tag, self.name))

if __name__ == "__main__":
    cat = Cat.show_info("xiao")
    cat.show_info2()


结果:
miao, xiao

猜你喜欢

转载自www.cnblogs.com/betterquan/p/12587690.html