• Python学习笔记3


    __slots__

    如果我们想要限制class的属性怎么办?比如,只允许对Student实例添加nameage属性。

    为了达到限制的目的,Python允许在定义class的时候,定义一个特殊的__slots__变量,来限制该class能添加的属性:

    >>> class Student(object):
    ...     __slots__ = ('name', 'age') # 用tuple定义允许绑定的属性名称
    ...

    然后,我们试试:

    >>> s = Student() # 创建新的实例
    >>> s.name = 'Michael' # 绑定属性'name'
    >>> s.age = 25 # 绑定属性'age'
    >>> s.score = 99 # 绑定属性'score'
    Traceback (most recent call last):
    
     File "<stdin>", line 1, in <module> AttributeError: 'Student' object has no attribute 'score' 


    由于'score'没有被放到__slots__中,所以不能绑定score属性,试图绑定score将得到AttributeError的错误。

    使用__slots__要注意,__slots__定义的属性仅对当前类起作用,对继承的子类是不起作用的:

    >>> class GraduateStudent(Student):
    ...     pass
    ...
    >>> g = GraduateStudent()
    >>> g.score = 9999
     

    除非在子类中也定义__slots__,这样,子类允许定义的属性就是自身的__slots__加上父类的__slots__

    __str__

    我们先定义一个Student类,打印一个实例:

    >>> class Student(object):
    ...     def __init__(self, name):
    ...         self.name = name
    ...
    >>> print Student('Michael')
    <__main__.Student object at 0x109afb190>

    打印出一堆<__main__.Student object at 0x109afb190>,不好看。

    怎么才能打印得好看呢?只需要定义好__str__()方法,返回一个好看的字符串就可以了:

    >>> class Student(object):
    ...     def __init__(self, name):
    ...         self.name = name
    ...     def __str__(self):
    ...         return 'Student object (name: %s)' % self.name
    ...
    >>> print Student('Michael')
    Student object (name: Michael)

    这样打印出来的实例,不但好看,而且容易看出实例内部重要的数据。

    但是细心的朋友会发现直接敲变量不用print,打印出来的实例还是不好看:

    >>> s = Student('Michael')
    >>> s
    <__main__.Student object at 0x109afb310>

    这是因为直接显示变量调用的不是__str__(),而是__repr__(),两者的区别是__str__()返回用户看到的字符串,而__repr__()返回程序开发者看到的字符串,也就是说,__repr__()是为调试服务的。

    解决办法是再定义一个__repr__()。但是通常__str__()__repr__()代码都是一样的,所以,有个偷懒的写法:

    class Student(object):
        def __init__(self, name):
            self.name = name
        def __str__(self):
            return 'Student object (name=%s)' % self.name
        __repr__ = __str__

    没有return语句的函数,依然会返回一个值,这个值即为None

    尝试用函数在一个list写入数值,而又希望多次调用函数时,只记录当次写入的数值,可采用def f(a,l)而后在函数中判断if l is None,这样在之后调用函数时,可以只输入一个参数,此时
    即会默认参数l为None


  • 相关阅读:
    推荐一本SQL经典书籍
    准备升级包包版游戏大厅
    《博客园精华集软件工程分册》第三轮筛选结果
    (翻译)《Expert .NET 2.0 IL Assembler》 第八章 基本类型和签名(一)
    如何输入人名间的顿号
    推荐一个下名人传记电子书的好地方
    asp.net 2.0 中使用web.config存储数据库连接字符串
    Asp.Net小技巧之在client端调用server端事件:
    C#编码好习惯
    把ip转换成对应的城市名
  • 原文地址:https://www.cnblogs.com/alansheng/p/4546903.html
Copyright © 2020-2023  润新知