python类(2)
#从python开始学习编程 学习笔记
以后看书时注意一下书上表述:好像是类属性attribute,对象特性property,对象方法
1、对于一个类下的全部个体来说,某些属性可能存在个体差异。不是所有的人类都是男,或者都是女。这个性质的值随着对象的不同而不同。
因此,为了完整描述个体,除了共性的类属性外,我们还需要用于说明个性的对象属性。在类中,我们可以通过self来操作对象的属性。
2、python提供了初始化对象属性的办法,python定义了一系列特殊方法,又称为魔法方法,前后有两个下划线,比如__init__()、__add__()、__dict__()等
3、对于类的__init__()方法,python会在每次创建对象时自动调用。因此,我们可以在__init__()方法内部来初始化对象属性。
4、除了操作对象属性外,self参数还有另外一个功能,就是能让我们在一个方法内部调用同一类的其他方法。
5、覆盖,一般情况下,子类和父类都有的方法,子类会覆盖父类的方法,可以调用super函数保留父类方法(有点奇怪,搞两个方法干啥了??)
class Bird:
def chirp(self):
print('make sound') class Chicken(Bird):
def chirp(self):
super().chirp()
print('ji')
summer=Chicken()
print(summer.chirp())
# make sound
# ji
# None
#从结果来看,先调用父类方法,再调用子类方法
6、一切皆对象:我们知道,list是列表的类。如果用dir(list)查看list的属性,能看到一个属性是__add__(),从样式来看,__add__()是特殊方法(魔法方法)。
他特殊在哪呢?这个方法定义了‘+’运算符对于list对象的意义,两个list对象相加时,会进行合并列表的操作。
(1.8).__mul__(2.8) #5.04
True.__or__(False) #True
[1,2,3]+[4,5,6] #[1, 2, 3, 4, 5, 6]
['abc']+['def'] #['abc', 'def']
'abc'.__add__('def') #'abcdef'
7、属性覆盖的背后
class Bird:
feather=True
def chirp(self):
print('some sound')
class Chicken(Bird):
fly=False
def __init__(self,age):
self.age=age
def chirp(self):
print('ji')
summer=Chicken(2)
print('==============> summer')
print(summer.__dict__)
print('==============> Chicken')
print(Chicken.__dict__)
print('==============> Bird')
print(Bird.__dict__)
print('==============> object')
print(object.__dict__)
==============> summer
{'age': 2}
==============> Chicken
{'__module__': '__main__', 'fly': False, '__init__': <function Chicken.__init__ at 0x00000188456A0488>, 'chirp': <function Chicken.chirp at 0x00000188456A0510>, '__doc__': None}
==============> Bird
{'__module__': '__main__', 'feather': True, 'chirp': <function Bird.chirp at 0x00000188456A0598>, '__dict__': <attribute '__dict__' of 'Bird' objects>, '__weakref__': <attribute '__weakref__' of 'Bird' objects>, '__doc__': None}
==============> object
{'__repr__': <slot wrapper '__repr__' of 'object' objects>, '__hash__': <slot wrapper '__hash__' of 'object' objects>, '__str__': <slot wrapper '__str__' of 'object' objects>, '__getattribute__': <slot wrapper '__getattribute__' of 'object' objects>, '__setattr__': <slot wrapper '__setattr__' of 'object' objects>, '__delattr__': <slot wrapper '__delattr__' of 'object' objects>, '__lt__': <slot wrapper '__lt__' of 'object' objects>, '__le__': <slot wrapper '__le__' of 'object' objects>, '__eq__': <slot wrapper '__eq__' of 'object' objects>, '__ne__': <slot wrapper '__ne__' of 'object' objects>, '__gt__': <slot wrapper '__gt__' of 'object' objects>, '__ge__': <slot wrapper '__ge__' of 'object' objects>, '__init__': <slot wrapper '__init__' of 'object' objects>, '__new__': <built-in method __new__ of type object at 0x0000000059A8B580>, '__reduce_ex__': <method '__reduce_ex__' of 'object' objects>, '__reduce__': <method '__reduce__' of 'object' objects>, '__subclasshook__': <method '__subclasshook__' of 'object' objects>, '__init_subclass__': <method '__init_subclass__' of 'object' objects>, '__format__': <method '__format__' of 'object' objects>, '__sizeof__': <method '__sizeof__' of 'object' objects>, '__dir__': <method '__dir__' of 'object' objects>, '__class__': <attribute '__class__' of 'object' objects>, '__doc__': 'The most base type'}
第一行为bird类的属性,比如feather。第二行为chicken类的属性,比如fly和__init__方法。第三行为summer对象的属性,也就是age。有一些属性,比如__doc__,并不是由我们定义的,而是由Python自动生成。此外,bird类也有父类,是object类(正如我们的bird定义,class bird(object))。这个object类是Python中所有类的父类。
print(dir(summer))
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'age', 'chirp', 'feather', 'fly']
如果我们用内置函数dir来查看summer的属性的话,可以看到summer对象包含了全部四个部分,也就是说,Python中的属性是分层定义的,比如这里分为object/bird/chicken/summer这四层。当我们需要调用某个属性的时候,Python会一层层向上遍历,直到找到那个属性。(某个属性可能出现在不同的层被重复定义,Python向上的过程中,会选取先遇到的那一个,也就是比较低层的属性定义)。这正是属性覆盖的原理所在。由于对象不需要重复存储其祖先类的属性,所以分层管理的机制可以节省存储空间。
值得注意的是,上面都是调用属性的操作,如果进行赋值,那么python就不会分层深入查找了。
autumn=Chicken(3)
autumn.feather=False
print(summer.feather) #True
print(autumn.__dict__) #{'age': 3, 'feather': False}
因此,python在为属性赋值时,只会搜索对象本身的__dict__,如果找不到对应属性,则将在__dict__中增加。在类 定义的方法中,如果用self引用对象,
也会遵守相同规则。
此外,我们可以不依赖继承关系,直接去操作某个祖先类的属性。
Bird.feather=3
8、特性
同一个对象的不同属性之间可能存在依赖关系。当某个属性被修改时,我们希望依赖于该属性的其他属性也同时变化。这时,我们不能通过__dict__的静态词典
方式来存储属性。Python提供了多种即时生成属性的方法。其中一种称为特性(property)。特性是特殊的属性。
class Bird:
feather=True
class Chicken(Bird):
fly=False
def __init__(self,age):
self.age=age
def get_adult(self):
if self.age>1.0:
return True
else:
return False
adult=property(get_adult) #property is bulit-in
summer=Chicken(2)
print(summer.adult) #True
print(summer.get_adult())#True
summer.age=0.5
print(summer.adult) #False
print(summer.get_adult()) #False
class Bird:
feather=True
class Chicken(Bird):
fly=False
def __init__(self,age):
self.age=age
@property
def get_adult(self):
if self.age>1.0:
return True
else:
return False
summer=Chicken(2)
print(summer.get_adult)#True
summer.age=0.5
print(summer.get_adult) #False
9、比较如下代码区别:
class Bird:
feather=True
age=2
def __init__(self,name):
self.name=name
class Chicken(Bird):
fly=False
def __init__(self,age):
self.age=age
@property
def get_adult(self):
if self.age>1.0:
return True
else:
return False
summer=Chicken(2)
print(summer.get_adult)#True
summer.age=0.5
print(summer.get_adult) #False
class Bird:
feather=True
age=2
def __init__(self,name):
self.name=name
class Chicken(Bird):
fly=False
# def __init__(self,age):
# self.age=age
@property
def get_adult(self):
if self.age>1.0:
return True
else:
return False
summer=Chicken()
print(summer.get_adult)
summer.age=0.5
print(summer.get_adult)
#如果用self引用对象,本层没有,好像会找到父类那一层去。
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-48-496496d87f7c> in <module>()
14 else:
15 return False
---> 16 summer=Chicken()
17 print(summer.get_adult)#True
18 summer.age=0.5 TypeError: __init__() missing 1 required positional argument: 'name'
class Bird:
feather=True
age=2
def __init__(self,name):
self.name=name
class Chicken(Bird):
fly=False
# def __init__(self,age):
# self.age=age
@property
def get_adult(self):
if self.age>1.0:
return True
else:
return False
summer=Chicken(2)
print(summer.get_adult)#True
summer.age=0.5
print(summer.get_adult) #False
class Bird:
feather=True
age=2
def __init__(self,name):
self.name=name
class Chicken(Bird):
fly=False
age=2 #增加age=2
# def __init__(self,age):
# self.age=age
@property
def get_adult(self):
if self.age>1.0:
return True
else:
return False
summer=Chicken()
print(summer.get_adult)
summer.age=0.5
print(summer.get_adult)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-50-9ac0fb881573> in <module>()
15 else:
16 return False
---> 17 summer=Chicken()
18 print(summer.get_adult)#True
19 summer.age=0.5 TypeError: __init__() missing 1 required positional argument: 'name'
class Bird:
feather=True
age=2
class Chicken(Bird):
fly=False
@property
def get_adult(self):
if Bird.age>1.0:
return True
else:
return False
summer=Chicken()
print(summer.get_adult)#True
summer.age=0.5
print(summer.get_adult) #True
与上面类似,修改了实例特性,但是类属性没有修改,通过类方法调用的时候修改不起 作用,类属性没有修改。
class A:
x='jim'
@classmethod
def run(cls):
y=cls.x
print('{} is running'.format(y))
return y
class B(A):
pass
b=B()
print(b.run())
b.x='yang'
print(b.x)
print(A.x)
print(b.run())
#jim is running
#jim
#yang
#jim
#jim is running
#jim
10、特性使用内置函数property()来创建。property()最多可以加载四个参数。前三个参数为函数,分别用于设置获取、修改和删除特性是,Python应该执行的操作。最后一个参数为特性的文档,可以为一个字符串,起说明作用。
class Num:
def __init__(self,value):
self.value=value
def get_neg(self):
return -self.value
def set_neg(self,value):
self.value=-value
def del_neg(self):
print('value also deleted')
del self.value
neg=property(get_neg,set_neg,del_neg,'i am negative')
x=Num(1.2)
print(x.neg) # -1.2
x.neg=-22
print(x.value) #
print(Num.neg.__doc__) #i am negative
del x.neg #value also deleted
python类(2)的更多相关文章
- Python类中super()和__init__()的关系
Python类中super()和__init__()的关系 1.单继承时super()和__init__()实现的功能是类似的 class Base(object): def __init__(sel ...
- LightMysql:为方便操作MySQL而封装的Python类
原文链接:http://www.danfengcao.info/python/2015/12/26/lightweight-python-mysql-class.html mysqldb是Python ...
- python 类属性与方法
Python 类属性与方法 标签(空格分隔): Python Python的访问限制 Python支持面向对象,其对属性的权限控制通过属性名来实现,如果一个属性有双下划线开头(__),该属性就无法被外 ...
- python 类以及单例模式
python 也有面向对象的思想,则一切皆对象 python 中定义一个类: class student: count = 0 books = [] def __init__(self ...
- Python类的特点 (1):构造函数与方法
Python中,类的特点: #encoding:utf-8 class Parent(object): x=1 #x是Parent类的属性(字段) def __init__(self): print ...
- Python类属性,实例属性
1.Python类数据属性:定义在类里面但在函数外面的变量,它们都是静态的. #一段很简单的代码,但反应了很多 >>> class A(): a=1 #一个类里面有个属性a > ...
- python类及其方法
python类及其方法 一.介绍 在 Python 中,面向对象编程主要有两个主题,就是类和类实例类与实例:类与实例相互关联着:类是对象的定义,而实例是"真正的实物",它存放了类中 ...
- python类的定义和使用
python中类的声明使用关键词class,可以提供一个可选的父类或者说基类,如果没有合适的基类,那就用object作为基类. 定义格式: class 类名(object): "类的说明文档 ...
- Python类的探讨
我们下面的探讨基于Python3,我实际测试使用的是Python3.2,Python3与Python2在类函数的类型上做了改变 1,类定义语法 Python类定义以关键字class开头,一个类定义例 ...
- python - 类成员修饰符
在java,c#类的成员修饰符包括,公有.私有.程序集可用的.受保护的. 对于python来说,只有两个成员修饰符:公有成员,私有成员 成员修饰符是来修饰谁呢?当然是修饰成员了.那么python类的成 ...
随机推荐
- CSAPP读书笔记--第八章 异常控制流
第八章 异常控制流 2017-11-14 概述 控制转移序列叫做控制流.目前为止,我们学过两种改变控制流的方式: 1)跳转和分支: 2)调用和返回. 但是上面的方法只能控制程序本身,发生以下系统状态的 ...
- Android框架模式
参考大佬写的文章:https://www.jianshu.com/p/f17f5d981de7 1.MVC模式 Model:模型层,负责处理数据的加载或存储 View:视图层,负责界面数据的展示,与和 ...
- SmartAssembly .net混淆后,无法找到部分类型
两种解决方式: 1,在vs项目引用中,COM 嵌入互操作类型, 全部设为false. 2, 在混淆选项中,排除所有 引有的 外部COM类
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):glyphicon glyphicon-pencil
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...
- HttpClient测试
导入maven依赖 <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson&l ...
- python_os 的知识点
1. os.getcwd() #获得当前路径 2. os.listdir(path) #列出path路径下的所有目录名和文件名包括后缀 3. os.mkdir(path) #在path创建一个目录 4 ...
- mqtt已断开连接(32109)
在rabbitmq下使用mqtt协议时,如果服务质量(qos)设置为2,在发布服务时会出现[已断开连接 (32109) - java.io.EOFException]的报错. 出现该报错的其他情况还有 ...
- 基于Ambari的WebUI实现服务缩容
基于Ambari的WebUI实现服务缩容 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.实现服务的扩容 1>.进入到主机的管理界面 2>.查看主机的信息概览 3&g ...
- scanf与正则表达式的搭配及应用
scanf与正则表达式的搭配及应用 正则其实我也学的不咋地,只会一点皮毛,正则最大的作用就是当输入流是一个字符串,我们能在输入的时候就滤掉无用信息,省去后期提取数值的步骤. 正则的语法我怕误人子弟,嘿 ...
- C++编程学习(七) 循环结构
1.continue:循环体中结束本次循环,直接进入下一次循环. 2.break:循环直接结束. 3.在for语句循环体中执行continue语句,程序会转到“表达式3”继续运行. 4.使用多重循环的 ...