二十一. Python基础(21)--Python基础(21)
二十一. Python基础(21)--Python基础(21)
1 ● 类的命名空间
|
#对于类的静态属性: #类.属性: 调用的就是类中的属性 #对象.属性: 先从自己的内存空间里找名字, 找到了用自己的, 没找到用类的, 如果类中也没有,就报错 #对于类的动态属性(方法): # 这个方法本身就存在类中,并不会存在对象的内存中 # 如果要通过对象调用类中的方法, 这依赖于 去对象中的一个地址簿去类中寻找对应的方法 #对于对象的属性: # 对象的属性就存在对象的命名空间中 # 只能被对象调用、修改, 不能被类调用(类内调用: self.属性名; 类外调用: 对象.属性) |
|
class A: country = '印度' def __init__(self, name): self.name = name def show_name(self): print(self.name)
A.gender = 'male' # 在类体外定义类属性 A.country = '中国' # 在类体外修改已有的类属性/静态属性的值() a = A("Arroz") a.age = 18 # 在类体外定义对象属性 print(A.country) print(a.gender) a.show_name() ''' 中国 male Arroz ''' for i in A.__dict__.items(): # 打印类属性, 可以看到, 在类体外定义的类属性('gender', 'male')存在于类体中 print(i, end = "\n") ''' ('__module__', '__main__') ('country', '中国') ('__init__', <function A.__init__ at 0x000000000272A840>) ('show_name', <function A.show_name at 0x000000000272A8C8>) ('__dict__', <attribute '__dict__' of 'A' objects>) ('__weakref__', <attribute '__weakref__' of 'A' objects>) ('__doc__', None) ('gender', 'male') ''' for i in a.__dict__.items(): # 打印对象属性, 可以看到, 在类体外定义的类属性('age', 18)存在于类体中, 但在类体外定义的对象属性不存在于类体中, print(i, end = "\n") ''' ('name', 'Arroz') ('age', 18) '''
class A: country = '印度' def show_name(self): print(self.name)
a = A() #实例化对象 a.name = 'Alex' # 给对象创建一个name属性 a.show_name() #调用了show_name()方法 ''' Alex '''
class A: country = '印度' def show_name(self): print(self.name)
a = A() a.name = 'Alex' a.show_name = 'Egon' a.show_name() ''' 报错: TypeError: 'str' object is not callable '''
class A: country = '印度' def show_name(self): print(self.name)
a = A() b = A() print(A.country) # 印度 print(a.country) # 印度, 先找a对象的内存, 再找类A的内存 print(b.country) # 印度 a.country = '中国' # 给a对象创建了一个属性 print(A.country) # 印度 print(a.country) # 中国 print(b.country) # 印度 # 如果是在C++中, 如果某一个对象修改了静态属性, 其它对象的静态属性(实际上是同一个静态属性)也将改变 |
2 ● 组合
|
组合就是在一个类中以另外一个类的对象作为对象属性 组合表达的是 什么有什么(A 有 B) 的一种关系, 例如①圆环的大环和小环的关系, ②教师与课程的关系, ③ 人与生日的关系 作用: 增强了代码的重用性 |
|
class Dog(): role = 'dog'
def __init__(self, name, aggressivity, blood): self.name = name self.aggr = aggressivity self.blood = blood
def bite(self, person): print('%s bites %s' % (self.name, person.name)) person.blood -= self.aggr
class Weapon(): # 定义类时, 类体可以是空的, 所以__init__()等属性也不是必须的 def prick(self, dog): dog.blood -= 500
class Person: role = 'person'
def __init__(self, name, aggressivity = 200): self.name = name self.aggr = aggressivity self.blood = 20000 self.weapon = Weapon() # 类的组合
def attack(self, dog): print('%s attacks %s'%(self.name, dog.name)) dog.blood -= self.aggr
egon = Person('Egon') # 攻击力采用默认的200 alex = Person('Alex', 500) # 重新声明攻击力500 mica = Dog('Mica', 1000, 3000) # mica咬egon mica.bite(egon) print('egon.blood:', egon.blood) # egon反攻mica,, mica减血200, 剩2800 egon.attack(mica) print('mica.blood:', mica.blood) print('##################') mica.bite(alex) # mica咬alex print('alex.blood:', alex.blood) # alex反攻mica,, mica减血500, 剩2300 alex.attack(mica) print('mica.blood:', mica.blood) |
二十一. Python基础(21)--Python基础(21)的更多相关文章
- 第一、二章——Python简介与Python基础
前言:<Data Wrangling with Python>这本书主要是讲使用Pyhon来处理各种类型保存的数据的. 第一章:Python简介 1.版本选择 本书选择的Python版本是 ...
- 8.python笔记之面向对象基础
title: 8.Python笔记之面向对象基础 date: 2016-02-21 15:10:35 tags: Python categories: Python --- 面向对象思维导图 (来自1 ...
- Python股票分析系列——基础股票数据操作(一).p3
该系列视频已经搬运至bilibili: 点击查看 欢迎来到Python for Finance教程系列的第3部分.在本教程中,我们将使用我们的股票数据进一步分解一些基本的数据操作和可视化.我们将要使用 ...
- Python运维开发基础05-语法基础【转】
上节作业回顾(讲解+温习90分钟) #!/usr/bin/env python # -*- coding:utf-8 -*- # author:Mr.chen import os,time Tag = ...
- D10——C语言基础学PYTHON
C语言基础学习PYTHON——基础学习D10 20180906内容纲要: 1.协程 (1)yield (2)greenlet (3)gevent (4)gevent实现单线程下socket多并发 2. ...
- D06——C语言基础学PYTHON
C语言基础学习PYTHON——基础学习D06 20180821内容纲要: 面向对象初级学习 1 面向对象 2 类 (1)封装 (2)继承 (3)多态 3 小结 4 练习:选课系统 5 课外拓展:答题系 ...
- D05——C语言基础学PYTHON
C语言基础学习PYTHON——基础学习D05 20180815内容纲要: 1 模块 2 包 3 import的本质 4 内置模块详解 (1)time&datetime (2)datetime ...
- 【Python笔记】Python语言基础
Python是一种解释性(没有编译).交互式.面向对象的语言 1.安装python编译器 版本:Python2.7比较普遍,Python不是向下兼容的软件,因此Python3.x有些东西不好找资料 2 ...
- 零基础入门Python实战:四周实现爬虫网站 Django项目视频教程
点击了解更多Python课程>>> 零基础入门Python实战:四周实现爬虫网站 Django项目视频教程 适用人群: 即将毕业的大学生,工资低工作重的白领,渴望崭露头角的职场新人, ...
随机推荐
- Go 初体验 - 令人惊叹的语法 - defer.2 - 如何提前执行?
上一文中讲到 defer 会在宿主函数 return 之前调用,那么我们就是想在宿主函数执行到中间调用,怎么办呢? 1. 改变宿主函数逻辑,分成多个函数,需要的那个函数里 defer . 2. 使用匿 ...
- ASP.NET页面之间传值的方式之Application(个人整理)
Application Application变量在整个应用程序生命周期中都是有效的,类似于使用全局变量一样,所以可以在不同页面中对它进行存取.它和Session变量的区别在于,前者是所有的用户共用 ...
- 【转】学习Robot Framework必须掌握的库—-BuiltIn库
作为一门表格语言,为了保持简单的结构,RF没有像别的高级语言那样提供类似if else while等内置关键字来实现各种逻辑功能,而是提供给了用户BuiltIn库.如果用户想在测试用例中实现比较复杂的 ...
- Windbg程序调试系列1-Mex扩展使用总结
最近一直在频繁使用Windbg做线上Dump调试,与微软做Case交流的时候,发现微软CSS团队,用了一个非常效率的Windbg 插件,Mex: 使用介绍: https://blogs.msdn.mi ...
- LinQ各种方式查询、组合查询、IQueryable集合类型
1.模糊查询(包含) Repeater1.DataSource = con.car.Where(r =>r.name.Contains(s)).ToList(); 2.开头查询 Repeater ...
- 谷歌浏览器怎样把网页全部内容保存为.mhtml文件?
Chrome保存.mhtml网页文件的方法: 在 Chrome 地址栏中键入chrome://flags,回车, 在页面搜索栏输入mhtml 把“Save Page as MHTML”项修改为 Ena ...
- ipconfig/release时:系统找不到指定的文件。无法连接网络
问题描述: ipconfig/release时:系统找不到指定的文件,无法连接网络,无法获取正确ip地址 处理方法: 修复Winsock和重置IP设置.第一步:开始-运行,输入cmd,打开命令行窗口. ...
- Linux 系统查看对应公网映射地址
最近在解决网络问题时,需要查看本机的出口公网IP信息,所以在网络上搜索和请求运维达人,获得如下两个方法: curl ifconfig.me 在linux系统中输入上述的命令,可以查看到本机连接的公网信 ...
- centos6安装配置zabbix3被控端
Centos 6.5 Zabbix 3.0.4 zabbix分为zabbix-server(主控端)和zabbix-agent(被控端),本文则介绍安装agent和server端添加监控: 主控端添加 ...
- bitbucket迁移
bitbucket 迁移 1.停止向旧仓库地址提交代码 [dev]2.导入代码至新仓库地址 [op]3.修改本地仓库地址 第一种方式:git remote set-url origin [url] ; ...