class 类的创建
class Eaeting:
'''
创建一个吃的类
'''
def __init__(self,something):
'''
初始化方法;
self.x :属性
'''
self.something=something
self.spicy=0
self.chefLv=5
def yummy(self):
return 'yummy! yummy!'
yuecai = Eaeting('yuecai')
print(yuecai.something)
print(yuecai.spicy)
say=yuecai.yummy()
print(say)
初始化方法init,当创建实例的时候就会调用init里面的方法,所以称为初始化方法
类属性
- 类属性,又称静态属性
- 只能通过类去修改
- 实例也有类属性,但不能修改类属性
class Tommy:
who='me is tommy'
print(dir(Tommy))
who这个时候就是Tommy的类属性,通过函数去打印一下
print(dir(Tommy))
['__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__', 'who']
# 最后面有一个who的属性
Shui = Tommy() # 创建一个实例化对象叫Shui
print(dir(Shui))
['__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__', 'who']
# 最后面有一个who的属性
类属性和实例化属性的区别
class Tommy:
who='me is tommy'
# print(dir(Tommy))
Tommy.me = 'just me' # 新增一个类属性me
print('这是类属性的',dir(Tommy))
print('-'*30)
Shui = Tommy() # 创建实例化
print('这是实例属性的',dir(Shui))
- Tommy.me = ‘just me’ 类属性可以新增的,这里我添加了一个me的属性,这个时候Tommy这个类,具有第一次创建的who和第二次新增的me
- Shui这个实例也具有一样的,第一次创建的who和第二次新增的me
Tommy(父),Shui(子),他们有父子关系
Shui会继承了Tommy的类属性
class Tommy:
who='me is tommy'
# print(dir(Tommy))
Tommy.me = 'just me'
print('这是类属性的1',dir(Tommy))
print('-'*30)
Shui = Tommy() # 创建实例化
Shui.wo='just wo' #实例增加实例属性
print('这是实例属性的',dir(Shui))
print('这是类属性的2',dir(Tommy))
这是类属性的1 ['__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__', 'me', 'who']
------------------------------
这是实例属性的 ['__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__', 'me', 'who', 'wo']
这是类属性的2 ['__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__', 'me', 'who']
实例也有类属性,但不能修改类属性
实例属性
- 实例属性,又称动态属性
- 通过实例创建
- 不同的实例,实例属性不同
- 实例__dict__显示当前实例的所有属性
class Me:
def __init__(self,name):
self.name = name
T = Me('wo shi tommy')
print('这是T实例化的',dir(T))
print('这是T实例化的属性',T.name)
print('T当前实例的所有属性',T.__dict__)
print('-'*100)
O = Me('wo shi tom')
print('这是O实例化的',dir(O))
print('这是O实例化的属性',O.name)
print('O当前实例的所有属性',O.__dict__)
这是T实例化的 ['__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__', 'name']
这是T实例化的属性 wo shi tommy
T当前实例的所有属性 {'name': 'wo shi tommy'}
----------------------------------------------------------------------------------------------------
这是O实例化的 ['__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__', 'name']
这是O实例化的属性 wo shi tom
O当前实例的所有属性 {'name': 'wo shi tom'}
在举个例子看看类似属性和实例属性,看看dir(M),M.__dict__有些不同,
class HAHA:
A = 'AAA'
def __init__(self,name):
self.name = name
M = HAHA('wo shi m')
print('这是O实例化的',dir(M))
print('这是O实例化的属性',M.name)
print('O当前实例的所有属性',M.__dict__)
输出结果
这是O实例化的 ['A', '__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__', 'name']
这是O实例化的属性 wo shi m
O当前实例的所有属性 {'name': 'wo shi m'}
self的作用
- 类中没有特殊规定,都用self作为第一参数
- self应用当前实例
class HAHA:
def __init__(self):
print(self)
Y=HAHA()
print(Y)
输出结果
<__main__.HAHA object at 0x00000263E2338C40>
TypeError: times() missing 1 required positional argument: ‘x’
原因是直接调用类的方法会报错,因为self应用当前实例
class Times:
def times(self,x):
return x * 2
a = Times()
a = a.times(2)
print(a)
print(Times.times(3)) #直接调用类的方法会报错,因为self只的是实例的本身,正确(Times.times(a,3))