如何成为测试开发,第6天

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))

猜你喜欢

转载自blog.csdn.net/qq_30864373/article/details/112057988
今日推荐