当前位置: 首页 > news >正文

python对象属性的继承_python入门(十四):面向对象(属性、方法、继承)

面向对象和函数管理数据:

类:

专有数据(可以存储,和对外使用)

方法(用于操作专有数据的),实现操作数据的规则。

函数:

无专有数据,谁给他传值都可以处理,并返回

本身不能存储数据。

class compute:

def __init__(self,a,b):

self.a = a

self.b = b

def add(self):

return self.a+self.b

def add(a,b):

return a+b

#print(add(1,2))

c= compute(1,2)

print(c.add())

c.a+=1

c.b+=1

print(c.a)

print(c.b)

类:作为一个整体,

把一组相关数据放到类的实例里面,进行存储、计算等

实现安全性、独立性,规则的操作统一。

class Person:

def __init__(self,name,gender):

self.name = name

self.gender = gender

def get_name(self):#实例方法,必须要实例化

return

self.name

#print(Person("吴老师","Male").get_name())#只能使用一次(连着写,没有存到变量里,使用一次就消失了)

wulaoshi = Person("吴老师","Male")#实例化

print(wulaoshi.get_name())

----------------

class Person:

count = 0 #类变量

def __init__(self,name,gender):

self.name = name

self.gender = gender

Person.count +=1

def get_name(self):#实例方法,必须要实例化

return

self.name

#类方法:可以使用类变量,不能使用实例变量(参数没有self,找不到实例的地址,因此不能用实例变量。)

#通过类名来使用,类名.get_instance_count()

#也可以通过实例调用,实例对象.get_instance_count()

@classmethod

def get_instance_count(cls):

return Person.count

#只能使用一次

#print(Person("吴老师","Male").get_name())

#wulaoshi = Person("吴老师","Male")#实例化

#print(wulaoshi.get_name())

print(Person.count)

Person("吴老师","Male")

print(Person.count)

print(Person.get_instance_count())

print(Person("吴老师","Male").get_instance_count())#通过实例对象调用类方法

静态方法

class Person:

count = 0 #类变量

nation = "中国"

def __init__(self,name,gender):

self.name = name

self.gender = gender

Person.count +=1

def get_name(self):#实例方法,必须要实例化

return

self.name

#类方法:可以使用类变量,不能使用实例变量

#通过类名来使用,类名.get_instance_count()

#也可以通过实例调用,实例对象.get_instance_count()

@classmethod

def get_instance_count(cls):

return Person.count

@classmethod

def create_a_instance(cls):

return Person("张","女")

@staticmethod   #静态方法:不需要self和cls

def get_nation():

return Person.nation

#只能使用一次

#print(Person("吴老师","Male").get_name())

#wulaoshi = Person("吴老师","Male")#实例化

#print(wulaoshi.get_name())

#print(Person.count)

#Person("吴老师","Male")

#print(Person.count)

#print(Person.get_instance_count())

#print(Person.create_a_instance())

#print(Person("吴老师","Male").get_instance_count())

print(Person.get_nation())

print(Person("吴老师","Male").get_nation())

三种方法的区别:

1 实例方法,参数要有self,必须通过实例化的对象去调用。

2 类方法,要加上@classmethod来声明,参数至少有一个,

一般定义为cls,只能使用类变量,不能使用实例变量。

通过类名或者实例对象调用。

3 静态方法,要加上@staticmethod来声明,可以没有参数,

使用类变量,不能使用实例变量。

通过类名或者实例对象调用。

不想做实例化,且只操作类变量:类方法、静态方法

如果想使用实例变量,只能使用实例方法了。

@staticmethod   #静态方法:不需要self和cls

def get_more():

Person.count +=100

return Person.count

print(Person("吴老师","Male").get_more())

单继承

class Person:

count = 0 #类变量

nation = "中国"

def __init__(self,name,gender):

self.name = name

self.gender = gender

Person.count +=1

print("创建了一个新的人")

def get_name(self):#实例方法,必须要实例化

return

self.name

class ChinaPerson(Person):

pass  #如果子类没有定义__init__构造方法

#会自动调用父类的。

cp = ChinaPerson("吴老师","男")

print(

cp.name)

print(cp.gender)

print(cp.get_name())

print(cp.count)

继承:子类具备所有父类的共有变量和共有方法

如果子类没有定义__init__构造方法,会自动调用父类的。

"""

继承:子类具备所有父类的共有变量和共有方法

如果子类没有定义__init__构造方法,会自动调用父类的。

好处:站在老爸的肩膀上,增加属性,增加方法

在原有的基础上进行扩展。

"""

扩展

class Person:

count = 0 #类变量

nation = "中国"

def __init__(self,name,gender):

self.name = name

self.gender = gender

Person.count +=1

print("创建了一个新的人")

def get_name(self):#实例方法,必须要实例化

return

self.name

class ChinaPerson(Person):

#如果子类没有定义__init__构造方法

#会自动调用父类的。

def __init__(self,name,gender):

Person.__init__(self,name,gender)

def get_gender(self):

return self.gender

cp = ChinaPerson("吴老师","男")

print(cp.count)

多继承

----------

class Person:

count = 0 #类变量

nation = "中国"

def __init__(self,name,gender):

self.name = name

self.gender = gender

Person.count +=1

print("创建了一个新的人")

def get_name(self):#实例方法,必须要实例化

return

self.name

class Bird:

def __init__(self,color):

print("a bird is birthed!")

self.color = color

def fly(self):

print("I can fly in the sky!")

class ChinaBirdPerson(Person,Bird):

#如果子类没有定义__init__构造方法

#会自动调用父类的。

def get_gender(self):

return self.gender

cp = ChinaBirdPerson("吴老师","男")

print(cp.color)

"""

继承:子类具备所有父类的共有变量和共有方法

如果子类没有定义__init__构造方法,会自动调用父类的。

好处:站在老爸的肩膀上,增加属性,增加方法

在原有的基础上进行扩展。

多继承:在括号里面写上多个基类(父类)

子类的构造函数,如果没有实现,则调用第一个基类的构造

函数。

"""

-------------

class Person:

count = 0 #类变量

nation = "中国"

def __init__(self,name,gender):

self.name = name

self.gender = gender

Person.count +=1

print("创建了一个新的人")

def get_name(self):#实例方法,必须要实例化

return

self.name

class Bird:

def __init__(self,color):

print("a bird is birthed!")

self.color = color

def fly(self):

print("I can fly in the sky!")

class ChinaBirdPerson(Person,Bird):

#如果子类没有定义__init__构造方法

#会自动调用父类的。

def __init__(self,name,gender,color):

Person.__init__(self,name,gender)

Bird.__init__(self,color)

def get_gender(self):

return self.gender

cp = ChinaBirdPerson("吴老师","男","红色")

print(cp.color)

print(cp.get_name())

print(cp.fly())

java里面是没有多继承的,但是有多个接口

class Person:

count = 0 #类变量

nation = "中国"

def __init__(self,name,gender):

self.name = name

self.gender = gender

Person.count +=1

print("创建了一个新的人")

class Bird:

def __init__(self,color):

print("a bird is birthed!")

self.color = color

def fly(self):

print("I can fly in the sky!")

def get_name(self):#实例方法,必须要实例化

return "bird has no name"

class ChinaBirdPerson(Person,Bird):

#如果子类没有定义__init__构造方法

#会自动调用父类的。

def __init__(self,name,gender,color):

Person.__init__(self,name,gender)

Bird.__init__(self,color)

def get_gender(self):

return self.gender

cp = ChinaBirdPerson("吴老师","男","红色")

print(cp.get_name())

---------------

class ChinaBirdPerson(Person,Bird):

#如果子类没有定义__init__构造方法

#会自动调用父类的。

def __init__(self,name,gender):

Person.__init__(self,name,gender)

#Bird.__init__(self,color)

def get_gender(self):

return self.gender

cp = ChinaBirdPerson("吴老师","男")

print(cp.color)

p  -->get_name

Person                Bird-->get_name

ChinaBirdPerson

cp.get_name()

py3都是新式类,深度优先,没有经典类

class P:

#def get_name(self):

#    return "P name!"

pass

class Person(P):

count = 0 #类变量

nation = "中国"

def __init__(self,name,gender):

self.name = name

self.gender = gender

Person.count +=1

print("创建了一个新的人")

class Bird:

def __init__(self,color):

print("a bird is birthed!")

self.color = color

def fly(self):

print("I can fly in the sky!")

def get_name(self):#实例方法,必须要实例化

return "bird has no name"

class ChinaBirdPerson(Person,Bird):

#如果子类没有定义__init__构造方法

#会自动调用父类的。

def __init__(self,name,gender):

Person.__init__(self,name,gender)

#Bird.__init__(self,color)

def get_gender(self):

return self.gender

cp = ChinaBirdPerson("吴老师","男")

print(cp.get_name())

"""

继承:子类具备所有父类的共有变量和共有方法

如果子类没有定义__init__构造方法,会自动调用父类的。

好处:站在老爸的肩膀上,增加属性,增加方法

在原有的基础上进行扩展。

多继承:在括号里面写上多个基类(父类)ChinaBirdPerson(Person,Bird)

子类的构造函数,如果没有实现,则调用第一个基类的构造

函数。

"""

多继承的时候同名方法,会进行深度优先的查找。

9d6788f539c7525fbbeb34e25066d5fe.png

MRO方法解析表确实P在在前面

从父类、爷爷类去查找方法,叫做深度优先

从多继承的同级类去查找方法,叫做广度优先

p  -->get_name(爷爷类)

Person(父类)                Bird-->get_name(父类)

ChinaBirdPerson(孙类)

cp.get_name()

class P:   class P():   class P(object):三种类的定义方法等价

相关文章:

  • python 几何教学_opencv-python-学习笔记九(图像几何转换)
  • c++builder安装opengl组件_刚下完的游戏竟然缺少组件?是游戏出了问题还是系统出了问题...
  • mysql的root用户密码_如何修改MySQL root用户密码
  • mysql 授权语句格式_mysql语句的授权
  • mysql charset=utf-8_mysql数据库charset=utf-8
  • nodejs mysql 断线重连_nodejs中mysql断线重连
  • mac mysql.tar.gz_mac 安装 mysql.tar.gz
  • debian 编译mysql源码_debian 下编译mysql源码出错【求助】
  • python linspace函数_c语言中的python linspace++
  • 因为左侧和右侧的元素数目不同。_求数组中第K大的元素
  • mysql查询优化非索引_mysql 查询优化和索引使用心得
  • mysql ab复制延时_MySQL AB复制详述
  • Java将MySQL数据写入json_Java实现将json中的数值插入到mysql中
  • mysql部署模型_proxysql-单主模型MGR部署
  • python 报表打印预览_python学习笔记之wxpython打印预览
  • 4个实用的微服务测试策略
  • C++11: atomic 头文件
  • express如何解决request entity too large问题
  • Git 使用集
  • java8 Stream Pipelines 浅析
  • java中具有继承关系的类及其对象初始化顺序
  • magento 货币换算
  • Map集合、散列表、红黑树介绍
  • PHP那些事儿
  • Python实现BT种子转化为磁力链接【实战】
  • storm drpc实例
  • vue.js框架原理浅析
  • 分布式熔断降级平台aegis
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 聊聊sentinel的DegradeSlot
  • 扑朔迷离的属性和特性【彻底弄清】
  • 深入 Nginx 之配置篇
  • 算法-图和图算法
  • 微信小程序--------语音识别(前端自己也能玩)
  • FaaS 的简单实践
  • Linux权限管理(week1_day5)--技术流ken
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • ​Base64转换成图片,android studio build乱码,找不到okio.ByteString接腾讯人脸识别
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • #考研#计算机文化知识1(局域网及网络互联)
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (南京观海微电子)——COF介绍
  • (循环依赖问题)学习spring的第九天
  • (一)Neo4j下载安装以及初次使用
  • (一)插入排序
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • .Family_物联网
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .NET/C# 中设置当发生某个特定异常时进入断点(不借助 Visual Studio 的纯代码实现)
  • .net打印*三角形
  • ?php echo $logosrc[0];?,如何在一行中显示logo和标题?
  • [ 常用工具篇 ] POC-bomber 漏洞检测工具安装及使用详解
  • [dfs搜索寻找矩阵中最长递减序列]魔法森林的秘密路径
  • [emuch.net]MatrixComputations(7-12)
  • [flask] flask的基本介绍、flask快速搭建项目并运行