类和对象定义:
类:类是具有相同属性和技能的一类事务。
对象:实例化一个类,是类的具体体现。
定义一个类的格式:
class 类名: "可以写一些解释信息" 类体(集体代码)
简单实现:
class Person: # 定义一个类 名字为Person animal = '高级动物' # 类里面定义的变量叫做静态变量 soup = '会思考' def work(self): # 类里面定义的函数叫做方法或者动态变量 print('人类会工作')
类名操作静态变量:
1、查 __dict__ 只能查,不能增删改:
1 print(Person.__dict__) 2 {'__module__': '__main__', 'animal': '高级动物', 'soup': '会思考', 'work': <function Person.work at 0x00000000023EB8C8>, '__dict__': <attribute '__dict__' of 'Person' objects>, '__weakref__': <attribute '__weakref__' of 'Person' objects>, '__doc__': None} 3 4 print(Person.__dict__['animal']) 5 高级动物
2、增删改查:
(1)、查
1 print(Person.animal) 2 高级动物 3 4 print(Person.soup) 5 会思考
(2)、改
Person.animal = '超级生物' Person.soup = '会打扮' print(Person.animal) 超级生物 print(Person.soup) 会打扮
(3)、增
1 Person.skill = '会说话' 2 3 print(Person.skill) 4 会说话
(4)、删
1 del Person.skill 2 3 print(Person.__dict__) 4 {'__module__': '__main__', 'animal': '高级动物', 'soup': '会思考', 'work': <function Person.work at 0x0000000001E7B8C8>, '__dict__': <attribute '__dict__' of 'Person' objects>, '__weakref__': <attribute '__weakref__' of 'Person' objects>, '__doc__': None}
一般想查询全部的静态变量时,用__dict__,其他全部用类名.变量名。
类名操作方法(动态变量):
1、使用__dict__操作
1 print(Person.__dict__['work'](None)) # 因为类里面的方法有一个形参,所以必须传一个实参,这个None传给self,不代表任何作用 2 人类会工作 3 None # 返回的None和传的None没关系,这是因为类里面的方法没有返回值。
2、直接使用:类名.方法名
1 Person.work(None) # 这个None和上面的意思是一样的。 2 人类会工作
如果是操作类里面的方法的话,就使用:类名.方法名 的方式。
1 class Person: 2 animal = '灵长类动物' 3 soup = '会思考' 4 5 def __init__(self,name,age,sex,high,weight): # __init__方法属于构造方法 6 self.name = name # 这些叫做属性 7 self.age = age 8 self.sex = sex 9 self.high = high 10 self.weight = weight 11 print('beautifully') 12 13 def work(self,job): 14 self.job = job # 在woek方法中添加一个属性,这里的self就是p1这个对象的内存地址 15 16 print(self) # <__main__.Person object at 0x000000000220AEF0> 17 print('人类会工作') 18 19 p1 = Person() # 实例化对象时,会直接触发__init__方法 20 beautifully
实例化一个对象,会自动触发类里面的构造方法,此时内部进行了三部:
1、实例化一个对象,在内存中产生一个对象空间。
2、自动执行init方法,并将这个空间对象(对象的内存地址)传给里面的self。
3、通过构造方法里面的代码给空间对象添加一些属性,并返回给对象。
1 p1 = Person('twonss',22,'male',177,133) # 只要init方法里面有参数,就要在实例化一个对象的时候传参数。 2 3 print(p1) # 生成一个丰满的对象空间地址<__main__.Person object at 0x00000000021CAE80> 4 print(p1.__dict__) # 以字典的形式打印出构造方法里面的属性。 5 {'name': 'twonss', 'age': 22, 'sex': 'male', 'high': 177, 'weight': 133}
在构造方法内添加属性:
p1.hobby = 'Bragging' print(p1.hobby) Bragging print(p1.__dict__) {'name': 'twonss', 'age': 22, 'sex': 'male', 'high': 177, 'weight': 133, 'hobby': 'Bragging'}
在类的其他方法内添加属性,比如在work方法里面添加一个属性。
p1 = Person('twonss',22,'male',177,133) p1.work('IT') # 先执行内部方法,然后查看是否成功添加属性 print(p1.job) IT print(p1.__dict__) {'name': 'twonss', 'age': 22, 'sex': 'male', 'high': 177, 'weight': 133, 'job': 'IT'}
查看此时方法内部的self和p1:
print(p1) # <__main__.Person object at 0x000000000220AEF0>
对象操作属性的两种方法:
1、查看属性,使用__dict__只能查:
1 print(p1.__dict__) 2 {'name': 'twonss', 'age': 22, 'sex': 'male', 'high': 177, 'weight': 133}
2、属性的增删改查:对象名.属性名
(1)增
1 p1.hobby = 'Bragging' 2 3 print(p1.__dict__) 4 {'name': 'twonss', 'age': 22, 'sex': 'male', 'high': 177, 'weight': 133, 'hobby': 'Bragging'}
(2)删
1 del p1.hobby 2 3 print(p1.__dict__) 4 {'name': 'twonss', 'age': 22, 'sex': 'male', 'high': 177, 'weight': 133}
(3)改
1 p1.name = 'eric' 2 3 print(p1.name) # eric 4 print(p1.__dict__) 5 {'name': 'eric', 'age': 22, 'sex': 'male', 'high': 177, 'weight': 133} 6 7 p1.age = 33 8 9 print(p1.age) # 33 10 print(p1.__dict__) 11 {'name': 'eric', 'age': 33, 'sex': 'male', 'high': 177, 'weight': 133}
(4)查
1 print(p1.name) # twonss 2 print(p1.age) # 22 3 print(p1.sex) # male 4 print(p1.high) # 177 5 print(p1.weight) # 133
3、通过对象访问类的静态变量(只能访问,不能增删改):
1 print(p1.animal) # 灵长类动物 2 print(p1.soup) # 会思考