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 ...
随机推荐
- linux工具集
1.ag:比grep.ack更快的递归搜索文件内容 安装: 1:首先在linux创建个sh文件->ag.sh 2:在ag.sh里面输入如下内容并保存 set -x TEMP_DIR=$(mkte ...
- 常见的几种JavaScript内存泄露
总结一下常见的几种JavaScript内存泄露: 1.意外的全局变量 全局变量属于window对象,所以只会随着window销毁才会销毁. 2.console.log() conaole.log()函 ...
- 【牛客】乃爱与城市拥挤程度 — 树形dp,up and down
我太难了 这题做得我要死了,来来回回写了大概八九个小时 错误的原因要么是快速幂写错(一生之敌,要么是忘取模爆\(longlong\)变负数\(QAQ\) \(update\) \(2019.11.13 ...
- Java已五年1—二本物理到前端实习生到Java程序员「回忆贴」
关键词:郑州 二本 物理专业 先前端实习生 后Java程序员 更多文章收录在码云仓库:https://gitee.com/bingqilinpeishenme/Java-Tutorials 前言 没有 ...
- redis 持久化RDB、AOF
1.redis持久化简介 Redis是一种高级key-value数据库.它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富.有字符串,链表,集合和有序集合.支持在服务器端计算集合 ...
- 如何使用pyenv在windows10安装多个python版本环境
安装pyenv-win pyenv-win的详细内容可以查看源地址 1.这里我用的是第一种安装方法: pip install pyenv-win --target %USERPROFILE%/.pye ...
- test命令的使用以及判断语法
test命令 Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值.字符和文件三个方面的测试. 语法:test EXPRESSION 或者 [ EXPRESSION ] 字符串判断( ...
- Building Applications with Force.com and VisualForce (DEV401) 中用到的Recruiting Application介绍
1.Who uses Recruiting Application. 2. Recruiting Application Object Model
- JavaScript语法记要
JavaScript语法记要 1.JS代码忽略缩进和换行 2.JS六种数据类型 String // 字符串 Number // 数值 Boolean // 布尔值 null // 空值 undefin ...
- AJAX完全解读
本文讲AJAX相关的知识全部讲解了一遍.要想入门,选择这篇文章完全够用 本文的知识图谱: AJAX的用处: 在没有AJAX之前,每次从服务端获取数据都要刷新页面(也就是同步请求),这十分的麻烦.比 ...