property和魔法方法

一、property

二、model,class,bases,mro

三、__doc__, __dict__,__call__,__item__,__len__,__str_

回到顶部

一、property

  1.普通的get和set方法 

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
# Author:Mr.yang '''
设计一个银行账户类
包含两个属性: 开户人姓名, 余额 # 注意:
# 一个类中全部属性都是私有的话, 那么这个类是无意义的
''' class Account(object):
def __init__(self, name, balance):
self.__name = name
self.__balance = balance # 实现两个属性的存取器方法
def get_name(self):
return self.__name # set
def set_balance(self, money):
if isinstance(money, int):
self.__balance = money
else:
print("输入类型有误") # get
def get_balanc(self):
return self.__balance # 存取器方法
# 设置数据 set
# 获取数据 get
# 命名规则 以set/get _ 属性名 # 使用存取器的好处
# 1. 安全,
# 2. 提供了精确的访问控制权限
# 3. 可以对数据进行有效的控制 # 测试
jack = Account('杨', 999999)
jack.set_balance(8888) print(jack._Account__name)
print(jack.get_name())
print(jack.get_balanc())

   2.使用property定义类属性

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
# Author:Mr.yang class Account(object): def __init__(self, name, balance):
self.__name = name
self.__balance = balance
self.__house = '北京' # 实现两个属性的存取器方法
def get_name(self):
return self.__name # set
def set_balance(self, money):
if isinstance(money, int):
self.__balance = money
else:
print("输入类型有误") # get
def get_balance(self):
return self.__balance # set
def set_address(self, new_add):
self.__house = new_add
# get
def get_address(self):
return self.__house
# del
def del_address(self):
del self.__house # 使用property 实现一个类属性
name = property(get_name)
balance = property(get_balance, set_balance)
address = property(get_address, set_balance, del_address, "这个是个地址") jack = Account('杨', 999999)
jack.balance = 'aa' print(jack.name)
print(jack.balance) print(jack.address)
print(Account.address.__doc__)
del jack.address
print(jack.address)

   3.使用property装饰器定义属性 

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
# Author:Mr.yang class Account(object):
def __init__(self, name, balance):
self.__username = name
self.__balance = balance
self.__house = '北京' # 使用property 装饰器时, 不需要以set/get开头
# @property 只能放在get方法
@property
def name(self):
return self.__username @property
def balance(self):
return self.__balance
# 当使用 set 方法, 使用的装饰器是 @ 被property装饰的get的方法名, setter
# 必须先去装饰 get 方法, 然后才能装饰set方法
@balance.setter
def balance(self, money):
if isinstance(money, int):
self.__balance = money
else:
print("输入类型有误") @property
def address(self):
return self.__house @address.setter
def address(self, new_add):
self.__house = new_add @address.deleter
def address(self):
del self.__house jack = Account('杨', 999999)
print(jack.name)
print(jack.balance) jack.balance = '' print(jack.address)
del jack.address
print(jack.address)

二、model,class,bases,mro

__module__ : 这个属性用来获取成员的所属模块

__class__ : 这个属性可以用来一个对象的所属类

__bases__ : 这个属性用来获取当前类的直接父类

__mro__ :这个属性用来获取当前类的 方法解析顺序,在继承时,初始化,查找方法,都是基于这个顺序实现的
#!/usr/bin/env python
# _*_ coding:utf-8 _*_
# Author:Mr.yang
# 动物类
class Animal(object):
pass # 人类继承动物类
class Person(Animal):
pass # 鸟类继承动物类
class Bird(Animal):
pass # 鸟人类继承人类和鸟类,即是多继承,也是多重继承
class BirdMan(Person, Bird):
pass # __module__ 这个属性用来获取成员的所属模块
print(BirdMan.__module__) # __class__ 这个属性可以用来一个对象的所属类
bm = BirdMan()
print(bm.__class__) # __bases__ 这个属性用来获取当前类的直接父类
print(BirdMan.__bases__) # __mro__ 这个属性用来获取当前类的 方法解析顺序
print(BirdMan.__mro__)
# 在继承时,初始化,查找方法,都是基于这个顺序实现的 """
__main__
<class '__main__.BirdMan'>
(<class '__main__.Person'>, <class '__main__.Bird'>)
(<class '__main__.BirdMan'>, <class '__main__.Person'>, <class '__main__.Bird'>, <class '__main__.Animal'>, <class 'object'>)
"""

三、__doc__, __dict__,__call__,__item__,__len__,__str__

  __doc__  :DocString 可以使用 xxx.__doc__(注意前后都是双_)属性,将 DocString 特性 print 打印出来。

  __dict__  :类中的 __dict__ 属性保存了类的所属模块,类中全局变量,方法,DocString 等内容 , 对象中的 __dict__ 属性 用来保存对象的属性

  __call__  :使自定义类的实例对象成为可调用对象。

  __item__  :使类中的字典或者列表,在实例化的对象上也可以进行正常操作

  __len__  :返回字符的长度

  __str__  :返回用户的想要返回的值

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
# Author:Mr.yang """
测试python当中的文档字符串, DocString
这句就是当前模块的DocString
"""
class Test():
"""
这个是一个模块中的测试类, 是来测试DocString
"""
# 方法
def show(self):
"""
这个是一个类方法中的DocString
"""
pass
def display():
"""
这个是一个模块内普通函数的DocString
"""
pass # 实例一个对象
t = Test()
print(t.__doc__)
print(Test.__doc__)
print(t.show.__doc__)
print(display.__doc__)
print(__doc__)
print(print.__doc__)

__doc__

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
# Author:Mr.yang
class Person(object):
''' __dict__ test'''
m = 1
def __init__(self):
self.__name = 'tom'
self.age = 1 def function(self):
print('Function') def __private_function(self):
print('Private Function') @staticmethod
def static_function():
print('Static Function') @classmethod
def class_function(cls):
print('Class Function') tom = Person() print(Person.__dict__)
print(tom.__dict__)
"""
{'__module__': '__main__', '__doc__': ' __dict__ test', 'm': 1, '__init__': <function Person.__init__ at 0x000002180502BA60>, 'function': <function Person.function at 0x000002180502BAE8>, '_Person__private_function': <function Person.__private_function at 0x000002180502BB70>, 'static_function': <staticmethod object at 0x000002180502E358>, 'class_function': <classmethod object at 0x000002180502E748>, '__dict__': <attribute '__dict__' of 'Person' objects>, '__weakref__': <attribute '__weakref__' of 'Person' objects>}
{'_Person__name': 'tom', 'age': 1}
"""

__dict__

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
# Author:Mr.yang
"""
python 中, 对象可以分为 可变对象 不可变对象
从调用角度 : 可调用对象 和 不可调用对象
callalbe
"""
# callable 查看对象是否可以调用
# print(callable(1))
# print(callable('a'))
# print(callable(''))
# print(callable([]))
# print(callable({})) def show():
print("show...")
show() # print(callable(show())) # 测的是函数的返回值 NONE
# print(callable(show)) class Test(object):
# 默认情况下, 一个自定义的实例对象是不可调用对象
# 如果想让这个自定义对象变成可调用对象
# 需要实现__call__
def __call__(self, *args, **kwargs):
print('call...')
# 如果自定义类实现了__call__方法, 那么对象在调用时, 会自动调用__call__方法
# 这种对象叫做仿函数
t = Test()
t()
print(callable(t))

__call__

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
# Author:Mr.yang
class StudentManager(object): '''学生信息管理''' def __init__(self):
# 使用字典来保存所有的学生信息
self.__students = {} # 添加学生
def __setitem__(self, key, value):
self.__students[key] = value # 获取学生
def __getitem__(self, item):
if item not in self.__students:
return None
return self.__students[item] # 删除学生
def __delitem__(self, key):
if key in self.__students:
del self.__students[key] # 获取学生人数
def __len__(self):
return len(self.__students) # 创建学生管理对象
sm = StudentManager() # 添加两个学生
sm[1] = 'tom'
sm[2] = 'jack'
# 查看学生个数
print(len(sm))
# 显示添加的学生
print(sm[1])
print(sm[2])
# 删除2号学生
del sm[2]
# 查看学生个数
print(len(sm))
# 查看是否删除
print(sm[1])
print(sm[2])

__item__

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
# Author:Mr.yang my_list = [1,2,3,4,5]
# print(len(my_list)) # 5 class Test(object):
def __init__(self):
self.__list = ['','','','',''] # 实现 __str__ , 自定义显示形式
def __str__(self):
# return str(self.__list)
string = '-'.join(self.__list)
return string # 实现 __len__()
def __len__(self):
return len(self.__list) t = Test()
print(t)
# len函数会隐式调用对象中的__len__方法
print(len(t))

__str__,__len__

property 和 魔法方法的更多相关文章

  1. 课时46:魔法方法:描述符(property的原理)

    目录: 一.描述符(property的原理) 二.课时46课后习题及答案 ********************************** 一.描述符(property的原理) ********* ...

  2. PHP的魔法方法__set() __get()

    php的魔法方法__set()与__get() Tags: PHP 我们先来看看官方的文档如何定义他们的: public void __set(string $name, mixed $value); ...

  3. 《Python基础教程(第二版)》学习笔记 -> 第九章 魔法方法、属性和迭代器

    准备工作 >>> class NewStyle(object): more_code_here >>> class OldStyle: more_code_here ...

  4. python 魔法方法

    I am not a creator, I just a porter. Note: Everything is object in python. 对于Python来说一切都是对象,也就是函数的参数 ...

  5. Python学习笔记:06魔法方法和迭代器

    魔法方法,属性和迭代器 新式类 通过赋值语句__metaclass=true或者class NewStyle(object)继承内建类object,可以表明是新式类. 构造方法 对象被创建后,会立即调 ...

  6. python学习笔记之七:魔法方法,属性

    在python中,有的名称会在前面和后面加上两个下划线,由这些名字组成的集合所包含的方法称为魔法方法(或者是特殊方法).如果对象实现了这些方法中的某一个,那么这个方法会在特殊的情况下(确切地说是根据名 ...

  7. Python魔法方法总结及注意事项

    1.何为魔法方法: Python中,一定要区分开函数和方法的含义: 1.函数:类外部定义的,跟类没有直接关系的:形式: def func(*argv): 2.方法:class内部定义的函数(对象的方法 ...

  8. 【python学习笔记】9.魔法方法、属性和迭代器

    [python学习笔记]9.魔法方法.属性和迭代器 魔法方法:xx, 收尾各有两个下划线的方法 __init__(self): 构造方法,创建对象时候自动执行,可以为其增加参数, 父类构造方法不会被自 ...

  9. python魔法方法、构造函数、序列与映射、迭代器、生成器

    在Python中,所有以__双下划线包起来的方法,都统称为"魔术方法".比如我们接触最多的__init__,魔法方法也就是具有特殊功能的方法. 构造函数 构造函数不同于普通方法,将 ...

随机推荐

  1. Atitit 酷奇的押金危机 遇到资金链断裂作为创始人应该怎么办

    Atitit 酷奇的押金危机  遇到资金链断裂作为创始人应该怎么办 遇到对方确实经营不善,资产已经还不了用户的押金怎么办?? 1. 一些重要原则 1 1.1. 二次分配原则  公平原则 1 1.2. ...

  2. 使用git和github进行协同开发流程

    (本文假设各位已经对基本git的基本概念.操作有一定的理解,如无相关git知识,可以参考Pro Git这本书进行相关的学习和练习) 很多项目开发都会采用git这一优秀的分布式版本管理工具进行项目版本管 ...

  3. spring gateway 截取response 长度缺失

    网上找到一段获取修改response的代码:https://blog.csdn.net/tianyaleixiaowu/article/details/83618037 代码如下: import or ...

  4. Windows 10 Version 1803 (Updated March 2018) MSDN 镜像下载

    微软已按先前预期于美国时间 2018 年 4 月 30 日正式向所有用户发布了 Windows 10 Version 1803 (Updated March 2018) 的 ISO 镜像下载,按微软官 ...

  5. bootstrap动态添加Tab标签页

    好久没有写博客了(主要是懒),工作中用到一个动态添加Tab的功能,众所周知,bootstrap没有动态添加Tab的功能,网上又没找到什么好用的,那咱就自己写呗?(因为懒,所以只写了添加的方法.(๑&g ...

  6. 【算法】八皇后问题 Python实现

    [八皇后问题] 问题: 国际象棋棋盘是8 * 8的方格,每个方格里放一个棋子.皇后这种棋子可以攻击同一行或者同一列或者斜线(左上左下右上右下四个方向)上的棋子.在一个棋盘上如果要放八个皇后,使得她们互 ...

  7. Win10系统安装UEFI+GPT配置

    借鉴博文  https://blog.csdn.net/lyj_viviani/article/details/51800445   安装win10需要改用UEFI引导模式,硬盘需要换成GUID格式; ...

  8. JTable动态刷新数据

    http://www.cnblogs.com/fnlingnzb-learner/p/6025408.html 注意下面几个方法的应用场景,不限于JTable,其他swing组件一样 ———————— ...

  9. apache2.4 httpd.conf httpd-vhost.conf配置

    extra / httpd-vhost.conf <VirtualHost *:81> DocumentRoot "/data/sda1_data/" ServerNa ...

  10. Spring Security的几个重要词

    1.SecurityContextHolder:是安全上下文容器,可以在此得知操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保存在SecurityContextHolder中. O ...