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

python12类的更多相关文章

  1. Java类的继承与多态特性-入门笔记

    相信对于继承和多态的概念性我就不在怎么解释啦!不管你是.Net还是Java面向对象编程都是比不缺少一堂课~~Net如此Java亦也有同样的思想成分包含其中. 继承,多态,封装是Java面向对象的3大特 ...

  2. C++ 可配置的类工厂

    项目中常用到工厂模式,工厂模式可以把创建对象的具体细节封装到Create函数中,减少重复代码,增强可读和可维护性.传统的工厂实现如下: class Widget { public: virtual i ...

  3. Android请求网络共通类——Hi_博客 Android App 开发笔记

    今天 ,来分享一下 ,一个博客App的开发过程,以前也没开发过这种类型App 的经验,求大神们轻点喷. 首先我们要创建一个Andriod 项目 因为要从网络请求数据所以我们先来一个请求网络的共通类. ...

  4. ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第二章:利用模型类创建视图、控制器和数据库

    在这一章中,我们将直接进入项目,并且为产品和分类添加一些基本的模型类.我们将在Entity Framework的代码优先模式下,利用这些模型类创建一个数据库.我们还将学习如何在代码中创建数据库上下文类 ...

  5. ASP.NET Core 折腾笔记二:自己写个完整的Cache缓存类来支持.NET Core

    背景: 1:.NET Core 已经没System.Web,也木有了HttpRuntime.Cache,因此,该空间下Cache也木有了. 2:.NET Core 有新的Memory Cache提供, ...

  6. .NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类

    .NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类 0x00 为什么要引入扩展方法 有的中间件功能比较简单,有的则比较复杂,并且依赖其它组件.除 ...

  7. Java基础Map接口+Collections工具类

    1.Map中我们主要讲两个接口 HashMap  与   LinkedHashMap (1)其中LinkedHashMap是有序的  怎么存怎么取出来 我们讲一下Map的增删改查功能: /* * Ma ...

  8. PHP-解析验证码类--学习笔记

    1.开始 在 网上看到使用PHP写的ValidateCode生成验证码码类,感觉不错,特拿来分析学习一下. 2.类图 3.验证码类部分代码 3.1  定义变量 //随机因子 private $char ...

  9. C# 多种方式发送邮件(附帮助类)

    因项目业务需要,需要做一个发送邮件功能,查了下资料,整了整,汇总如下,亲测可用- QQ邮箱发送邮件 #region 发送邮箱 try { MailMessage mail = new MailMess ...

随机推荐

  1. [敏捷软工团队博客]Beta阶段测试报告

    项目 内容 2020春季计算机学院软件工程(罗杰 任健) 博客园班级博客 作业要求 Beta阶段测试报告 我们在这个课程的目标是 在团队合作中锻炼自己 这个作业在哪个具体方面帮助我们实现目标 对Bet ...

  2. Scrum Meeting 0501

    零.说明 日期:2021-5-1 任务:简要汇报两日内已完成任务,计划后两日完成任务 一.进度情况 组员 负责 两日内已完成的任务 后两日计划完成的任务 qsy PM&前端 整装待发,准备冲刺 ...

  3. CentOS系统优化一键配置脚本

    #!/usr/bin/env bash PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export P ...

  4. linux上docker形式部署GB28181服务wvp,zlmedia

    目录 1.bash方式从镜像创建docker 2.下载vim 3.修改run.sh bug如下 4.修改application.xml 5.运行一下sh run.sh 6.Vim config.ini ...

  5. insertion-sort-list leetcode C++

    Sort a linked list using insertion sort. C++ /** * Definition for singly-linked list. * struct ListN ...

  6. Linux下向windows传输文件【sz 文件】没有弹框提示下载到什么位置

    Linux环境向windows环境传输文件 security crt工具,同同一个软件,连接不同服务器,有的服务器传送文件没有弹框选择要下载的文件路径,可以在[Options]-[Session Op ...

  7. Centos8上安装Mysql8.X

    一.下载Mysql 下载地址:https://dev.mysql.com/downloads/mysql/ 二.将压缩包通过ftp软件服务器的目标位置:并解压 1.我的是放在:/root/softwa ...

  8. 史上最简单的排序算法?看起来却满是bug

    大家好,我是雨乐. 今天在搜论文的时候,偶然发现一篇文章,名为<Is this the simplest (and most surprising) sorting algorithm ever ...

  9. 问题 C: A+B Problem II

    题目描述 I have a very simple problem for you. Given two integers A and B, your job is to calculate the ...

  10. 菜鸡的Java笔记 第十六 - java 引用传递

    referenceDelivery    引用传递是整个java 的精髓,也是所有初学者最难学的地方        引用的本质:同一块堆内存可以被不同的栈内存所指向    下面通过三道程序来进行引用传 ...