类用来描述具有相同的属性和方法的对象的集合。
对于在类中定义的函数,称为方法。
类变量不直接叫做类变量,称为属性。
类中主要就是方法和属性
1,类的定义,属性
简单示例
class Person(object):
name = 'nanfeng'
age = 18
mor = Person() #mor就是一个类的实例化
wum = Person() #wum也是一个类的实例化
mor.sex = 'man' #实例增加属性
print(Person()) #可以打印出这个类的内存地址空间
print(id(mor),id(wum)) #通过 id(实例) 可以查看实例化过后的实例对象空间
print(Person.name,Person.age) #通过Person.属性 来使用类中定义的属性
print(mor.sex) #实例调用自身属性
print(wum.sex) #这里就会报错,显示这个对象没有这个属性,因为实例化过后,每个实例都是相互独立的
输出结果
<__main__.Person object at 0x7fbcf21e8860>
140449492666968 140449492667920
nanfeng 18
man
Traceback (most recent call last):
File "/home/pyvip/project/py3code/base_item/13类的定义以及属性.py", line 17, in <module>
print(wum.sex)
AttributeError: 'Person' object has no attribute 'sex'
上面我们在类中定义的属性是可以被访问的,但是如果在属性前面出现了双下划线,比如__age = 18像这样的属性,我们就称为私有属性。这样的属性外部不可以直接访问
简单示例
class Person(object):
_name = 'Nanfeng' #这里一个下划线,可以直接进行访问
__sex = 'man' #这里两个下划线,为私有属性,不能直接访问
mor = Person()
mor._age = 18
print(mor._age)
print(mor._name)
print(mor._Person__sex) #虽然规定了为私有属性,但是还是可以访问,并没有正真限制的目的
print(mor.__sex)
输出结果
18
Nanfeng
man
Traceback (most recent call last):
File "/home/pyvip/project/py3code/base_item/13类的定义以及属性.py", line 32, in <module>
print(mor.__sex)
AttributeError: 'Person' object has no attribute '__sex'
在python中,_和__的使用,更多的是一种规范,约定,没有正真限制的目的,可以通过 示例._类名__属性 来访问私有属性
2,类中一些常用的查询方法,魔法方法
简单示例
class Person(object):
'''
这是一个类中的查询
'''
def __init__(self,name,age,sex): #__init__()初始化方法,其中的self是示例本身,规定了这样写,可以修改,但是不建议,后面的就是参数
self.name = name
self.age = age
self.sex = sex
print('我是第二个执行的')
def __new__(cls, *args, **kwargs): #__new__()方法是类中最先执行的方法,必须要有一个返回的对象,return
print('我是第一个最先执行的')
return object.__new__(cls)
def __str__(self):
'''
与__str__()方法类似的一个魔法方法是__repr__()方法
在python中,str和repr方法在处理对象的时候,分别调用的对象是__str__和__repr__,
print()打印的对象,调用str函数,如果对象没有定义__str__方法,则调用__repr__方法
都需要有一个返回的对象return
__str__ 对使用者(处理后的数据)
__repr__ 对开发者(原始数据)
:return:
'''
return '我也是需要被执行的魔法方法'
def __call__(self, *args, **kwargs): #__call__()方法,无论在什么情况下,示例调用的时候就执行
return '实例调用的时候我就被执行'
def __getattr__(self, item):
print('这是一个当访问不存在的属性是就给你提示的方法')
# def __getattribute__(self, item):
# print('当我们去访问一个属性时会自动调用')
# return object.__getattribute__(self,item)
person = Person('Nanfeng',18,'Man')
person()
#person.func() #和上面的getattr属性,这就是去访问一个没有的方法func()就会执行__getattr__()
#print(person)
print(hasattr(person,'name')) #查看是否有这个属性,返回的是bool值,存在就返回True,不存在就返回False
setattr(person,'age',20)
print(getattr(person,'age')) #返回这个属性的值
print(setattr(person,'height',180)) #设置一个属性的值,可以是新增加的,或者修改原来就有的
print(hasattr(person,'height'))
a = person.__class__ #查看类名
print(a)
b = person.__dict__ #查看全部属性,字典返回
print(b)
c = person.__doc__ #查看对象文档,就是'''里面的内容''' 或者 """里面的内容"""
print(c)
输出结果
我是第一个最先执行的
我是第二个执行的
True
20
None
True
<class '__main__.Person'>
{'name': 'Nanfeng', 'age': 20, 'sex': 'Man', 'height': 180}
这是一个类中的查询
Process finished with exit code 0