美文网首页
Day15——ClassObject

Day15——ClassObject

作者: Devil灬 | 来源:发表于2019-01-11 17:43 被阅读0次

一、方法

名称 声明 特点 调用
对象方法 直接声明 自带self参数,指向当前对象 对象.方法()
类方法 加@classmethod 自带cls参数,指向当前类 类.方法()
静态方法 加@staticmethod 没有默认参数 类.方法()

使用:
需要对象属性,声明对象方法;
若不需,则看需要类字段,声明类方法;
都不需,则声明静态方法


二、构造方法和__ init __方法

python中声明类的时候系统会自动创建这个类对应的构造方法,构造方法内会调用__ init __方法,用来对对象进行初始化, __ init __方法调用结束后,返回对象

def 与类名相同的构造方法(*args, **kwargs):
    对象 = 创建对象
    对象.__init__(*args, **kwargs)
    return 对象

def __init__(self):
    方法内容
  • 对象属性
    self.属性名 = 值
  • 类的字段
    字段名 = 值
class Person:
    # num就是类的字段
    num = 6

    # __slots__ = ('name', 'age')

    # 在init方法中声明对象属性
    def __init__(self, name, age):
        self.name = name
        self.age = age

注:(__ slots __魔法):约束当前类的对象最多能拥有几个属性,且会使对象的 __ dict __属性失效


三、对象属性的 增删查改

I. 增

对象.属性 = 值 添加属性(属性不存在时)
setattr(对象, 属性名, 值) 添加属性(属性不存在时,属性名为str)

II. 删

del 对象.属性 删除属性
delattr(对象, 属性名) 删除属性(属性名为str)

III. 查

对象.属性 获取对象指定属性值(属性必须存在)
getattr(对象, 属性名, 默认值) 获取对象指定属性值(属性不存存在,返回默认值,且默认值必须赋值,属性名为str)

IV. 改

对象.属性 = 值 修改属性(属性存在时)
setattr(对象, 属性名, 值) 修改属性(属性存在时,属性名为str)

四、内置属性

编号 表达式 功能 返回类型
1 对象.__ class __ 获取对象对应的类
2 类.__ name __ 获取类的名字 字符串
3 类.__ doc __ 获取类的说明文档 字符串
4 对象.__ dict __ 将对象转换成字典(属性:值) 字典
5 类.__ module __ 获取当前类所在的模块的模块名 字符串
6 类.__ bases __ 获取当前类的父类 元祖
  • 定制对象打印格式
def __repr__(self):
    # return '<%s.%s object at %s>' % (self.__class__.__module__, self.__class__.__name__, hex(id(self)))
    # 结果:<__main__.Person object at 0x29c310>
    return '<' + str(self.__dict__)[1:-1] + ' at ' + hex(id(self)) + '>'

五、私有化

python中在属性或者方法名前加 __ ,就可以将属性或者方法变成私有的
(注意:只能两 __ 开头,不能 __ 结尾)
私有的属性和方法只能在类的内部使用,不能在类的外面使用
原理:
在名字前是 __ 的属性和方法前再加 ' _ 类名 ' 去保存属性和方法


六、getter/setter

I. getter

第一步:声明属性的时候在属性名前加 _
第二步:声明函数(函数没有除了self以外的参数,但是要有返回值。返回值就是获取属性拿到的值)
第三步:在类的外部通过对象.去掉 _ 的属性去获取相关的属性

格式:

@property
def 去掉_的属性名(self):
做点别的事情
返回属性的值

class Person:
    def __init__(self):
        self._week = 7  # 属性名前有_,使用属性的时候不要直接用

    @property
    def week(self):
        if self._week < 7:
            return '星期%d' % self._week
        else:
            return '星期天'


p1 = Person()
# 通过不带_的属性来获取属性的值实质是在调用getter对应的函数
print(p1.week)

II. setter

(注:想要添加setter必须先要有getter)
第一步:声明属性的时候在属性名前加_
第二步:声明函数(函数除了self以外还需要一个参数,没有返回值。这儿的参数代表给属性赋的值)
第三步:在类的外部通过对象.去掉_的属性去给相关属性赋值

格式:

@属性名去掉 _ .setter
def 去掉 _ 的属性名(self, 参数):
做点别的事情
给属性赋值

class Person:
    def __init__(self):
        self._age = 0

    @property
    def age(self):
        return self._age

    # 给age添加setter
    @age.setter
    def age(self, value):
        if not isinstance(value, int):
            raise ValueError
        if not (0 <= value <= 150):
            raise ValueError
        self._age = value


p1 = Person()
# 通过不带_的属性给属性赋值实质是在调用setter对应的函数
p1.age = 45
print(p1.age)

相关文章

  • Day15——ClassObject

    一、方法 使用:需要对象属性,声明对象方法;若不需,则看需要类字段,声明类方法;都不需,则声明静态方法 二、构造方...

  • 类名、class和Object之间的相互转换

    String className // 类名Class cls // ClassObject obj // ...

  • C++面向对象高级编程(上) Week 1 (Boolan) b

    1-C++编程简介Object Based——以良好的方式编写-ClassObject Oriented——Cla...

  • 类的加载

    加载的类在 Dalvik 中是以 struct ClassObject 的形式存在的。 接下里看比较重要 Meth...

  • Day 15classObject

    一、编程思想 1.面向过程编程 - 遇到问题直接将逻辑转换成代码; 逻辑思维,算法2.函数式编程 - 遇到问题就想...

  • Day 16 classObject(2)

    一、私有化 1.属性和方法的访问权限 私有的:在类的外部不可以使用,也不可以继承保护的:在类的外部不可以使用,可以...

  • day15ClassObject

    编程思想 1.面向过程编程 - 遇到问题直接将逻辑转换成代码; 逻辑思维,算法2.函数式编程 - 遇到问题就想找一...

  • 2018-09-16

    Day15

  • 今日份摄影

    Day15

  • 2019.8.21 周三

    day15 5300

网友评论

      本文标题:Day15——ClassObject

      本文链接:https://www.haomeiwen.com/subject/btaxdqtx.html