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 ...
随机推荐
- winform不能循环引用,使用接口传值到界面
public partial class frmMain : Form, IFormManager { 4 public frmMain() { InitializeComponent(); 8 } ...
- 记一次Xmrig挖矿木马排查过程
问题现象 Linux 服务器收到报警信息,主机 CPU 跑满. 自动创建运行 Docker 容器 xmrig, 导致其他运行中容器被迫停止. 问题原因 通过 top 命令可以看到有一个 xmrig 进 ...
- 【原创】(六)Linux进程调度-实时调度器
背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...
- JS 冒泡排序详解
冒泡排序原理:比较相邻两个数的大小,如果第一个数大于第二个数,那么交换位置,从第一位数开始,对后面每一对相邻的数据进行同样的比较和交换,直到最后没有任何一位需要进行比较大小和交换: 思路演算: arr ...
- [概率] HDU 2019 Multi-University Training Contest 10 - Valentine's Day
Valentine's Day Time Limit: 2000/2000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Others ...
- 牛客网剑指offer【Python实现】——part1
斐波那契数列 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,n<=39). 循环实现,时间复杂度n def Fibonacci(self, ...
- type=file 文件修改表单 名称不能正常回显的问题
easyui 框架下 代码如下: css: .file_box{ float: right; width: 1035px; border: 1px solid #999; height: 32p ...
- 使用Keras进行深度学习:(一)Keras 入门
欢迎大家关注我们的网站和系列教程:http://www.tensorflownews.com/,学习更多的机器学习.深度学习的知识! Keras是Python中以CNTK.Tensorflow或者Th ...
- Java基础语法(9)-面向对象之类的成员
title: Java基础语法(9)-面向对象之类的成员 blog: CSDN data: Java学习路线及视频 1.面向对象特征--封装 为什么需要封装?封装的作用和含义? 我要用洗衣机,只需要按 ...
- ubuntu 如何在命令行打开当前目录
nautilus /var 打开var文件夹