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

类的成员和嵌套(建模)

一. 类的成员共分为三类: 字段, 方法, 属性

class Foo:

    country = '中国'       # 静态字段

    def __init__(self, name):
        self.name = name          # 普通字段

    def func(self):             # 普通方法, 至少有一个self参数
        pass

    @staticmethod               # 静态方法, 无默认参数
    def func2():
        pass

    @classmethod                # 类方法, 至少有一个cls参数
    def func3(cls):
        pass

    @property                   # 属性
    def func4(self):
        pass

  

一. 字段: 静态字段, 普通字段

通过类创建对象时,如果每个对象都具有相同的字段,那么就使用静态字段

静态字段访问方法

静态字段属于类, 静态字段通过类访问, 静态字段在内存中只保存一份

print(Foo.country)

普通字段访问方法

普通字段属于对象, 普通字段需要通过对象来访问, 普通字段在每个对象中都要保存一份

obj = Foo('123')

print(obj.name)


二. 方法: 普通方法, 静态方法, 类方法

三种方法在内存中都归属于类, 区别在于调用方式不同

普通方法: 由对象调用, 至少一个self参数, 执行普通方法时, 自动将调用该方法的对象赋值给self

obj = Foo('1232')

obj.func()

静态方法: 由类调用, 无默认参数

Foo.func3()

类方法: 由类调用, 至少一个cls参数, 执行类方法时, 自动将调用该方法的类复制给cls

Foo.func2()

相同点: 对于所有的方法而言, 均属于类(非对象)中, 所以, 在内存中也只保存一份

不同点: 方法调用者不同, 调用方法时自动传入的参数不同

 

三. 属性

定义时, 在普通方法的基础上添加 @property 装饰器, 属性仅有一个self参数

调用时, 无需括号, 这样节省时间

对于简单的方法, 当无需传参且有返回值时, 可以使用 @property

obj = Foo('1232')

obj.func4


四, 字段, 方法, 属性都有私有和公有, 需要在前面加上__, 例如def __func(): pass __country = 'China'

私有字段, 方法, 属性在调用时, 一般情况下都无法访问, 需要在类中访问

在继承时, 子类无法查看父类的私有字段, 方法, 属性

对于简单的方法, 当无需传参且有返回值时, 可以使用 @ property

 

五. 嵌套

class People(object):
    def __init__(self, name, address):
        self.name = name
        self.address = address

    def play(self):
        print('玩')


obj1 = People('企稳', '1000000')
obj2 = People('戊二醛', '1010000')


class Province(object):
    def __init__(self, name, location):
        self.name = name
        self.location = location
        self.people= None


p1 = Province('江苏', 'china')
p2 = Province('北京', 'china')

p1.people = obj1
p2.people = obj2

print(p1.people.name)
print(p1.people.address)
print(p1.name)
print(p1.location)
p1.people.play()

  

 

转载于:https://www.cnblogs.com/NachoLau/p/9550576.html

相关文章:

  • vue-组件基础
  • 办公用品管理系统VB——库存数量导出EXCEL,SaveEXCEL
  • 字节、字、bit、byte的关系
  • Timer 控件中的Elapsed事件与tick事件的区别
  • @ConfigurationProperties注解对数据的自动封装
  • Java 中创建子类对象会创建父类对象么?
  • 通过PXE部署系统时报错 0xc000000f
  • RabbitMQ之消息确认机制(事务+Confirm)
  • 大屏FAQ
  • java源码 - CountDownLatch
  • 推荐几十本DBA学习的书
  • 利用 Siblings一步实现多个同级div,只改变当前点击的div样式
  • 前端笔记-201808
  • 设置PHP最长运行时间
  • zabbix添加nginx中间件监控
  • 2017前端实习生面试总结
  • angular组件开发
  • CAP理论的例子讲解
  • express.js的介绍及使用
  • magento2项目上线注意事项
  • MySQL主从复制读写分离及奇怪的问题
  • oldjun 检测网站的经验
  • PHP 小技巧
  • 对象管理器(defineProperty)学习笔记
  • 好的网址,关于.net 4.0 ,vs 2010
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 简单易用的leetcode开发测试工具(npm)
  • 区块链将重新定义世界
  • 使用common-codec进行md5加密
  • 推荐一个React的管理后台框架
  •  一套莫尔斯电报听写、翻译系统
  • 在Unity中实现一个简单的消息管理器
  • 7行Python代码的人脸识别
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • 阿里云服务器购买完整流程
  • 国内开源镜像站点
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • ​卜东波研究员:高观点下的少儿计算思维
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • (arch)linux 转换文件编码格式
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (多级缓存)缓存同步
  • (二)JAVA使用POI操作excel
  • (二十三)Flask之高频面试点
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (论文阅读30/100)Convolutional Pose Machines
  • (一)认识微服务
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • (原創) 物件導向與老子思想 (OO)
  • (转)shell调试方法
  • (转)平衡树