面向对象命名空间、组合

一 类命名空间与对象、实例的命名空间

创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性

而类有两种属性:静态属性和动态属性

  • 静态属性就是直接在类中定义的变量
  • 动态属性就是定义在类中的方法

 

class Person:Country = '中国人'   # 静态变量print(Person.Country)
alex = Person()   # 创建了一个空的命名空间
alex.name = 'alex'  # 对象
alex.Country = '泰国人'
egon = Person()
egon.name = 'egon'
# 类名.静态变量  对象.属性名
# 类名可以调用对象的属性么?   不可以
# 对象可以调用类中的属性么?  可以
print(Person.Country)#中国人
print(alex.Country)#泰国人
print(egon.Country)#中国人# 由于对象和类之间存在一个关联关系
# 所以对象能够找到类
# 但是 类不能找到对象
# 
# 使用类名.属性 只会寻找类中的静态变量名字
# 使用对象.属性 会现在对象自己的命名空间中找名字
#             如果找不到 再到类的内存空间中去找


 

 

 

其中类的数据属性是共享给所有对象的

>>>id(egg.role)
4341594072
>>>id(Person.role)
4341594072

 

而类的动态属性是绑定到所有对象的

>>>egg.attack
<bound method Person.attack of <__main__.Person object at 0x101285860>>
>>>Person.attack
<function Person.attack at 0x10127abf8> 

 

创建一个对象/实例就会创建一个对象/实例的名称空间,存放对象/实例的名字,称为对象/实例的属性

在obj.name会先从obj自己的名称空间里找name,找不到则去类中找,类也找不到就找父类...最后都找不到就抛出异常 

 

 

class Person:money = 0mother = Person()
father = Person()
Person.money += 1000#类的静态属性等于1000
Person.money += 1000#类的静态属性等于2000
print(Person.money)#类的money属性等于2000
print(mother.money)#妈妈调用类的money等于2000
print(father.money)#父亲调用类的money属性也等于2000    

 

 

 

class Person:money = [0]#类的money的命名空间有一个列表,列表里是0

mother = Person()#妈妈开通一个空的命名空间
father = Person()#父亲开通一个命名空间
mother.money[0] += 1000#妈妈的命名空间里创建一个列表,列表里第一位索引等于1000元
father.money[0] += 1000#父亲的命名空间里创建一个列表,列表里第一位索引等于2000元
print(Person.money)#2000
print(mother.money)#2000
print(father.money)#2000

 

 

 

class Person:money = [0]mother = Person()
father = Person()
mother.money = [1000]#妈妈的money属性赋予新变量[1000]
father.money = [2000]#爸爸的money属性赋予新的变量[2000]
print(Person.money)#对象的money属性无法改变,类的money属性[0]
print(mother.money)#直接打印妈妈的新的变量属性[1000]
print(father.money)#直接打印爸爸的新的变量属性[2000]



 

 

 

面向对象的组合用法

软件重用的重要方式除了继承之外还有另外一种方式,即:组合

组合指的是,在一个类中以另外一个类的对象作为数据属性,称为类的组合

# 组合 两个类的事儿
# 什么叫组合 : 一个类对象的属性 是 另外一个类的对象
# 两个类的事儿 :类与类之间有一种"什么有什么的关系"

 

 

圆的类
圆环 和 圆
圆环 也是一个类
属性 大圆半径 和 小圆半径
圆环 求面积 求周长
# 圆环
from math import pi
class Circle:#创建一个圆的类def __init__(self,r):#初始化圆的对象,定义一个半径rself.r = rdef area(self):#圆的面积return pi*(self.r**2)def perimeter(self):#圆的周长return 2*pi*self.r
c1 = Circle(5)#c1是半径为5的圆#实例化
#c1.perimeter()#对象的调用周长属性
class Ring:#创建一个同心圆def __init__(self,outer,inner):#初始化同心圆的外环,内环self.outer = Circle(outer)   # 组合Ring的属性是,Circle类的实例化对象self.inner = Circle(inner)# 组合Ring的属性是,Circle类的实例化对象def area(self):#圆环的面积等于外环的面积➖内环的面积return self.outer.area() - self.inner.area()def perimeter(self):#圆环的周长等于外环的周长+内环的周长return self.outer.perimeter() + self.inner.perimeter()
 

 

 
老师  name sex course(课程) birth
生日 年月日
 
class Birthday:#生日类def __init__(self,year,month,day):#初始化对象self.year = year#生日类(被传入的对象)的年属性self.month = month#生日类的月属性self.day = day#生日类的日属性
class Teacher:#教师类def __init__(self,name,sex,course,birth):#初始化对象self.name = name#教师类(对象)的name属性self.sex = sex#教师的sex属性self.course = course#教师的course的属性self.birth = birth   # birth是一个对象

birth = Birthday(1960,3,7)   # birth 是Birthday类的一个对象
alex = Teacher('alex','male','python',birth)#Alex对象传入一个birth属性
# alex.birth = birth
# # time
# '1960-3-7'
# # 老师的年龄  2018 - 1960# print(birth)
# import time
# if birth.month == time.localtime().tm_mon  and \
#     birth.day == time.localtime().tm_mday:
#如果调用birth类的月属性等于结构化时间的月,日属性等于结构化时间的日
#     print('生日快乐')#打印生日快乐
# print(time.localtime().tm_year - birth.year)#用结构化年份-生日年份等于年龄

 
 
 

 

 

 

转载于:https://www.cnblogs.com/chongdongxiaoyu/p/8514931.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/250897.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

css --- 使用媒体查询当屏幕宽度小于某个值时,隐藏掉某个类

Bootstrap提供了一个封装好的类: .hidden-xs: 当屏幕宽度<768px时隐藏 .hidden-sm: 当屏幕768px < 宽度<992px时隐藏 .hidden-md: 当屏幕992px< 宽度<1200px时隐藏 .hidden-lg: 当屏幕宽度>1200px时隐藏 下面使用css3的 媒体查询来实现: media screen and…

09 受控组件

含义 受控组件&#xff1a;由state来决定表单内部的数据&#xff0c;由表单的事件处理函数来更改state的方式 class App extends React.Component {// 1. state是表单的唯一数据源state {name: }handleChange (e) > {// 2. 控制表单操作并同步statethis.setState({name:…

剑指Offer--青蛙跳台阶引发的一系列问题

题目描述 一只青蛙一次可以跳上1级台阶&#xff0c;也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法&#xff08;先后次序不同算不同的结果&#xff09;。解法一&#xff08;效率最高&#xff09;数学归纳法&#xff1a;public class Solution {public int JumpFloo…

css --- 伸缩布局,让图片居中

很明显,想要星星位于文字的正下方. // html <section id"lz_about" class"hidden-xs hidden-sm"><div class title text-center"><h1><strong>关于我</strong></h1><img src"./imgs/star.jpg" cla…

day9-Python学习笔记(二十)数据库备份,修改父类的方法

数据库备份&#xff0c;修改父类的方法 import os,datetimeclass BakDb(object): def __init__(self,ip,username,passwd,port3306,path/tmp/db_bak): self.ip ip self.username username self.passwd passwd self.port port self.path path …

10 非受控组件以及受控与非受控的选择方案

含义 非受控组件&#xff1a;表单数据不受控与state的&#xff08;未绑定value&#xff09;&#xff0c;使用React ref从DOM节点中获取表单数据的组件提示refs弃用 class MyForm extends React.Component {constructor(props) {super(props)}submit (e) > {e.preventDef…

wampserver3.0.6 外网 不能访问

# 开始 今天在服务器上安装了wampserver3.0.6 然后在我的电脑浏览器上面打开服务器ip提示 Forbidden 下面一行小字提示没有权限访问"/"目录 # 解决 打开 httpd-vhost.conf 文件 修改成如下 # Virtual Hosts #<VirtualHost *:80>ServerName localhostServerAlia…

javascript --- 在linux上部署项目

最近对照视频,用bootstrap jquery 写了一个纯前端页面.想把它放在服务器上,供远程使用. 准备服务器和域名 我服务器和域名是在腾讯云上租的,网址: https://cloud.tencent.com/ 注: 域名很便宜,挑个好的哈哈哈… 服务器(阿里云有个学生价…但是我那个学生价的账号找不到了…)…

【openssl】利用openssl完成X509证书和PFX证书之间的互转

利用openssl完成X509证书和PFX证书之间的互转 # OpenSSL的下载与安装&#xff1a; 1、下载地址&#xff1a; 官方网址—— https://www.openssl.org/source/ OpenSSL for Windows —— http://gnuwin32.sourceforge.net/packages/openssl.htm 2、安装&#xff1a;此处已OpenSSL…

11 父子组件数据关系与状态提升

含义 状态提升&#xff1a;两个组件&#xff08;无父子关系&#xff09;共享一个数据并且同步数据变化类组件调用&#xff08;实例化&#xff09;的时候&#xff0c;组件内部的状态是唯一且独立的组件嵌套与调用&#xff0c;和是类组件&#xff08;render&#xff09;还是函数…

SQL SERVER 一个SQL语句的执行顺序

SQL SERVER 一个SQL语句的执行顺序 原文:SQL SERVER 一个SQL语句的执行顺序一个SQL 语句的执行顺序 1、From (告诉程序 来自哪张表 如果是表表达式 依旧是如此顺序) 2、Where&#xff08;条件筛选 谓词筛选 &#xff09; 3、Group by&#xff08;分组&#xff09; 4、Having&…

JS-事件内置对象event

getKeyCode(event)当中的event必须全部小写&#xff0c;是JS中时间内置对象&#xff0c;可以直接拿来用&#xff0c;event内种对象代表此刻发生的事件 1 <!doctype html>2 <html lang"en">3 <head>4 <meta charset"UTF-8">5 …

工具分享 --- 分享一个在线制作ico的网站

还不错… 生成后一般放在imgs的下面. link:favicon tab 导入链接http://www.faviconico.org/

laravel迁移文件

laravel迁移文件的命令 Laravel鼓励敏捷、迭代的开发方式&#xff0c;我们没指望在第一次就获得所有正确的。我们对于自己编写代码,可以通过迁移文件,不断的重复去测试.对于工作&#xff0c;我们开发一个完整的项目,是需要我们每个人相互配合,就好比用svn,git版本控制工具来存储…

12 组合与继承、CSS Module

组合与继承 若Container内部有内容&#xff0c;React会在props内部增加children属性若Container内部有非元素内容&#xff0c;children&#xff1a;非元素内容若Container内部有单个元素内容&#xff0c;children&#xff1a;React元素对象若Container内部有多个元素内容&…

工具分享 --- tinyPNG,大图片压缩工具

今天自己的写的项目跑在了远程服务器上… 图片加载的速度让人难以接受, 于是各种百度找到了一个在线找到了个图片压缩的网站 TinyPNG 可以看一下压缩的效果…真心不错啊… 网站如下: https://tinypng.com 额…有些大于5M的需要钱,才能压缩… 用系统画图工具…貌似也能压缩… …

Mysql 忘记管理员密码更改

对管理员设置密码第一种方式&#xff1a;#mysqladmin -u root password new-password;#mysqladmin -u root -h localhost password new-password;mysql的选项可以不带空格&#xff0c;有时候带空格是错 第二种方式&#xff1a; set password for rootlocahostPASSWORED(); 第三…

ironic如何支持部署时按需RAID?

ironic如何支持部署时按需RAID&#xff1f; 新浪大神推荐使用element proliant-tools制作deploy image。element proliant-tools会在ipa ramdisk中安装一个rpm包hpssacli&#xff08;HP的RAID管理工具&#xff09;&#xff0c;和一个python module proliantutils&#xff08;里…

14 代码分割之lazy:Suspense与路由懒加载

lazy内置方法 Suspense内置组件 lazy是React提供的懒&#xff08;动态&#xff09;加载组件的方法&#xff0c;React.lazy() 能减少打包体积、延迟加载首屏不需要渲染的组件 依赖内置组件Suspense&#xff1a;给lazy加上loading指示器组件的一个容器组件 Suspense目前只和la…

三年工作的总结

其实开通博客已经有四年之久了,但遗憾的是从来没有认真写过一篇博客,只是在平时会浏览一些大牛写过的博客。 其实我觉得做技术的定期总结自己的经验还是很重要的。 不知不觉参加工作已经三年了,三年时间真的过得很快,想当初带着一腔热血,一个背包走天下,来到上海,从零开始&…