Python 类属性和方法
import types class Dog(object): __slots__ = ("name", "color", "info")
#定义__slots__
#该类中只允许 类对象 动态增加 name, color, info, body_len 属性或方法(都是实例属性或方法)
#__slots__对类的 动态添加属性和方法 没有限制,而 类对象 不能再动态添加对象属性和方法
#__slots__只对类对象进行限制,不对类进行限制
#_slots__仅对当前类起作用,对继承的子类不起作用
#__slots__不仅限制类对象的属性,还限制类对象的方法
#在子类中定义__slots__,子类允许定义的属性就是自身的__slots__加上父类的__slots__ company = '蓝月公司' #company 是类属性
len_attr = 1 #初始化狗的长度 def __init__(self, name):
self.name = name
#name 为实例属性 @staticmethod #静态方法可以写在类内
def state():
print("Dog 类的静态方法(state)") @classmethod #类方法可以写在类内
def get_state(cls):
print("狗狗的产地是" + cls.address) @property
def body_len(self):
return self.len_attr #如果不存在 __slots__ 作为约束,并且类属性不存在 len_attr 则 property 相当于新定义了一个实例属性 len_attr
#方法名(body_len)不能与其设置的属性名(len_attr)相同 @body_len.setter #装饰器名(body_len.setter)的前半部分必须与上文被装饰器 property 装饰的函数(body_len)同名
def body_len(self, value): #此处的方法名必须与上文中的被装饰器装饰的方法名相同,如果不同也不会报错,
#因为得到值本质调用的是上文被装饰器property装饰的函数(函数名并不重要)
#而设置值本质调用的是被装饰器 body_len.setter 装饰的函数(函数名并不重要)
#但为了能实现 把方法"变成"属性 ,这里的函数名必须与上文的函数名同名,否则就失去了装饰器 @property 存在的意义
if value > 2:
print("狗的体长必须小于2米")
else:
Dog.len_attr = value def get_name(self):
return self.name def set_name(self, name):
self.name = name name_attr = property(fget=get_name, fset=set_name, fdel=None, doc="设置狗的名字")
#property 函数就相当于 @property 装饰器 d = Dog('萨摩耶') #实例化 Dog 对象
e = Dog('土狗') d.color = 'black' #只给 d 对象增加 color 属性,Dog 基类和其它 Dog 对象并未有 color 属性 print(hasattr(d, 'color')) #判断 d 对象是否具有 color属性
print(hasattr(e, 'color')) Dog.address = '中国' #给 Dog 基类增加 address 属性 print(hasattr(d, 'address'))
print(hasattr(e, 'address')) def info(self):
print("产于" + self.address + "的" +self.name + "的颜色为" + self.color) d.info = types.MethodType(info, d) #只给 d 对象增加 info 方法,Dog 基类和其它 Dog 对象并未有 info 方法
d.info() #此方法为实例方法 print(hasattr(d, 'info'))
print(hasattr(e, 'info')) @staticmethod #静态方法可以写在类外(但必须指定(#000000#))
def show():
print("Dog 类的静态方法(show)") Dog.show = show #000000#
Dog.show()
d.show()
e.show()
d.state()
e.state()
Dog.state() @classmethod
def get_show(cls): #cls 只能调用 类属性 而不能调用 实例属性
print("公司:" + cls.company + " 产地:" + cls.address)
print(hasattr(cls, 'name')) #不存在 name 属性,因为它是 实例属性 Dog.get_show = get_show
d.get_show() d.body_len = 3
d.body_len = 1.8
print("当前长度" + str(d.body_len) + "米") print(d.name_attr)
d.name_attr = "杜宾犬"
print(d.name_attr)
Python 类属性和方法的更多相关文章
- python 类属性与方法
Python 类属性与方法 标签(空格分隔): Python Python的访问限制 Python支持面向对象,其对属性的权限控制通过属性名来实现,如果一个属性有双下划线开头(__),该属性就无法被外 ...
- Python类属性访问的魔法方法
Python类属性访问的魔法方法: 1. __getattr__(self, name)- 定义当用户试图获取一个不存在的属性时的行为 2. __getattribute__(self, name)- ...
- python从入门到大神---1、初始化实例、类属性、方法
python从入门到大神---1.初始化实例.类属性.方法 一.总结 一句话总结: 方法不加括号是代码段:感觉python方法和js,php很类似,不加括号是代码段,加括号变成方法,比如f,f() 1 ...
- python干货-类属性和方法,类的方法重写
类属性与方法 类的私有属性 __private_attrs: 两个下划线开头,表明为私有,外部不可用,内部使用时self.__private_attrs. 类的方法 在类的内部,使用 def 关键字来 ...
- python装饰器、继承、元类、mixin,四种給类动态添加类属性和方法的方式(一)
介绍装饰器.继承.元类.mixin,四种給类动态添加类属性和方法的方式 有时候需要給类添加额外的东西,有些东西很频繁,每个类都需要,如果不想反复的复制粘贴到每个类,可以动态添加. # coding=u ...
- python类属性用法总结
属性的定义:python中的属性其实是普通方法的衍生. 操作类属性有三种方法: 1.使用@property装饰器操作类属性. 2.使用类或实例直接操作类属性(例如:obj.name,obj.age=1 ...
- python类属性和类方法(类的结构、实例属性、静态方法)
类属性和类方法 目标 类的结构 类属性和实例属性 类方法和静态方法 01. 类的结构 1.1 术语 —— 实例 使用面相对象开发,第 1 步 是设计 类 使用 类名() 创建对象,创建对象 的动作有两 ...
- Python学习笔记之面向对象编程(三)Python类的魔术方法
python类中有一些方法前后都有两个下划线,这类函数统称为魔术方法.这些方法有特殊的用途,有的不需要我们自己定义,有的则通过一些简单的定义可以实现比较神奇的功能 我主要把它们分为三个部分,下文也是分 ...
- Python类属性和类方法
01. 类的结构 1.1 术语 —— 实例 使用面相对象开发,第 1 步 是设计 类 使用 类名() 创建对象,创建对象 的动作有两步: 1) 在内存中为对象 分配空间 2) 调用初始化方法 __in ...
随机推荐
- js中的堆和栈
http://www.jscwwd.com/article/5e533ae2552a8e2bf45d3d69 这里先说两个概念:1.堆(heap)2.栈(stack)堆 是堆内存的简称.栈 是栈内存的 ...
- mysql 多个字段重复记录查询
select * from productstockquantity t where () ORDER BY t.CombinationI
- 把 GitHub 放入口袋,“开箱”官方客户端
GitHub 2019 开发者大会说要出的客户端,今天(2020.3.18)终于放出了下载.之前如果登记过的小伙伴应该也和我一样收到了下面样子的邮件: 好了,那么接下来我们就来"开箱&quo ...
- 再说scss
1. CSS预处理器 定义了一种新的专门的编程语言,编译后成正常的CSS文件.为CSS增加一些编程的特性,无需考虑浏览器的兼容问题,让CSS更加简洁,适应性更强,可读性更佳,更易于代码的维护等诸多好处 ...
- 干货来啦。Flask框架看这一篇就够了,关注不迷路,Jeff带你看源码。开发技术时时更新
目录 一.初识Flask 1.1 什么是flask? 1.2 为什么要有flask? 二.Flask快速启动 三.Flask四剑客 三.flask的配置文件 可以配置的属性 四.flask路由 4.1 ...
- 一口气说出 6种,@Transactional注解的失效场景
整理了一些Java方面的架构.面试资料(微服务.集群.分布式.中间件等),有需要的小伙伴可以关注公众号[程序员内点事],无套路自行领取 一口气说出 9种 分布式ID生成方式,面试官有点懵了 面试总被问 ...
- linux svn切换用户
1. 临时切换 在所有命令下强制加上--username 和--password选项. 例如:svn up --username zhangsan --password 123456 2.永久切换 删 ...
- Spring Boot入门系列(九)如何实现异步执行任务
前面介绍了Spring Boot 如何整合定时任务,不清楚的朋友可以看看之前的文章:https://www.cnblogs.com/zhangweizhong/category/1657780.htm ...
- 数据库-第三章 关系数据库标准语言SQL-3.3 数据查询
数据查询 例: 一.单表查询 1.定义 是指仅涉及一个表的查询 2.选择表中的若干列 查询指定列 例: 查询全部列 例: 查询经过计算的值 例: 3.选择表中的若干元组 消除取值重复的行 例: 查询满 ...
- JavaScript 模式》读书笔记(4)— 函数2
这篇,我们仍旧继续学习函数. 二.回调模式 函数都是对象,这表示它们可以作为参数传递给其它函数. function writeCode(callback) { // 执行一些事务... callbac ...