标签:__init__ ini 私有 nbsp int height code sub eating
类(class)
类的三大要素:实例对象(instance)、属性(类属性和实例属性)、方法
1.类
类是具体对象的抽象集合,他好比一些具有共性的事物的抽象化,比如人类,人类这个类是对所有人的一个抽象化的描述,比如张三、李四,他们都是人,都有人的一些共性,比如有一个脑袋,一双手和一双脚等等,不仅仅是张三和李四,是个正常人,他们都有这些形态,所以他们组合成了一个类,再比如,狗这也是一个类,不管是田园犬、哈士奇还是家养的土狗,他们都是狗类,因为他们都有他们的共性。
2.类的定义
class Person: # class是类的关键字,Person是类名 """这是一个人类""" # 用于解释说明这个类 pass # 代码块
3.类的实例对象
类是一个抽象的概念,所以我们要想使用这个类,就需要实例出一个具体的对象,这就好比造房子,我们都知道房子这个概念,它就是供我们居住的,但是光知道这个概念我们还无法使用它,只有具体造出了这栋房子,我们才可以住进去。在这里,房子的这个概念就好比一个类(class),而真正造出来的房子就是一个实例对象(instance).再有娲造人的神话故事,女娲为了排解孤独,就根据自己的外在形态,也就是把自己作为一个模板,做出一个个泥人,然后给他们都赋予了生命,这里的女娲就好比是一个模子,也就是一个类,而被造出来的一个个泥人,就是一个具体的实例对象。
class Person: # class是类的关键字,Person是类名 """这是一个人类""" # 用于解释说明这个类 pass # 代码块 # 类的实例化 zgzeng = Person()
4.类属性和实例属性
类属性好比一个类里面所有的实例对象共有的特性,就好比女娲造人的时候,她会根据自己的外在形态,比如一双眼睛,一双手脚等等特性来造人。
实例属性就好比一个个实例对象独有的特性,比如女娲造了一个张三,让他身材高大,造了一个李四让他身材矮小等等。
class Person: """这是一个人类""" # 类属性 Person_name = " " Person_age = "" zgzeng = Person() # 实例属性 zgzeng.name = "zgzeng" zgzeng.age = 23 print(zgzeng.name) # zgzeng print(zgzeng.age) # 23
4.1 添加类属性和实例属性
添加类属性和实例属性,方法为类名.属性名 = 属性, 实例对象名.属性名 = 属性
class Person: """这是一个人类""" # 类属性 Person_name = " " Person_age = "" zgzeng = Person() # 实例属性 zgzeng.name = "zgzeng" zgzeng.age = 23 Person.height = "180cm" # 添加类属性 zgzeng.weight = "55kg" # 添加实例属性 print(Person.height) # 180cm print(zgzeng.weight) # 55kg
4.2 修改类属性和实例属性
class Person: """这是一个人类""" # 类属性 Person_name = " " Person_age = "" zgzeng = Person() # 实例属性 zgzeng.name = "zgzeng" zgzeng.age = 23 Person.height = "180cm" # 添加类属性 zgzeng.weight = "55kg" # 添加实例属性 print(Person.height) # 180cm print(zgzeng.weight) # 55kg print(id(Person.height)) # 1907760411632 print(id(zgzeng.weight)) # 1907760412784 Person.height = "175cm" # 175cm zgzeng.weight = "60kg" print(Person.height) # 175cm print(zgzeng.weight) # 60kg print(id(Person.height)) # 1907760412912 print(id(zgzeng.weight)) # 1907760412848
属性的idclass Person: """这是一个人类"""
# 类属性 Person_name = "zhang" Person_age = "22" zgzeng = Person() Person.height = "180cm" # 实例属性 zgzeng.name = "zgzeng" zgzeng.age = 23
# 在外面修改类里面写入的属性值,id不变 print(id(Person.Person_name)) # 2313282911216 Person_name = "wang" print(Person.Person_name) # zhang print(id(Person.Person_name)) # 2313282911216
# 在类外面添加的属性,在外面修改id会改变
print(id(Person.height)) # 2284420248240 Person.height = "182cm" print(Person.height) # 182cm print(id(Person.height)) # 2284420249840
class Person: """这是一个人类""" # 类属性 Person_name = "zhang" Person_age = "22" zgzeng = Person() Person.height = "180cm" # 实例属性 zgzeng.name = "zgzeng" zgzeng.age = 23 # 通过实例对象来修改类里面定义的类属性,我从id上我们可以发现,他无法修改里面的属性值 zgzeng.Person_name = "zgzeng" print(zgzeng.Person_name, id(zgzeng.Person_name)) # zgzeng 3156132887664 print(Person.Person_name, id(Person.Person_name)) # zhang 3156132887600 # 通过实例对象来修改类外面添加的类属性,我们可以id发生改变,且Person的属性height没变 print(id(zgzeng.height)) # 2910735217328 zgzeng.height = "188cm" print(Person.height) # 180cm print(zgzeng.height) # 188cm print(id(zgzeng.height)) # 2910735218928 # 通过实例对象来修改实例属性 print(id(zgzeng.name)) # 1442299575408 zgzeng.name = "Ruyi" print(zgzeng.name) # Ruyi print(id(zgzeng.name)) # 1442300279024
4.3 查看实例属性和类属性
class Person: """这是一个人类""" # 类属性 Person_name = "zhang" Person_age = "22" zgzeng = Person() Person.height = "180cm" # 实例属性 zgzeng.name = "zgzeng" zgzeng.age = 23 # print(Person.name) # AttributeError: type object ‘Person‘ has no attribute ‘name‘ print(zgzeng.Person_name) # zhang
实例对象可以访问类属性,而类不能访问实例属性
4.4 删除实例属性和类属性
class Person: """这是一个人类""" # 类属性 Person_name = "zhang" Person_age = "22" zgzeng = Person() Person.height = "180cm" # 实例属性 zgzeng.name = "zgzeng" zgzeng.age = 23 del zgzeng.name del Person.Person_name print(zgzeng.name) # ‘Person‘ object has no attribute ‘name‘ print(Person.Person_name) # type object ‘Person‘ has no attribute ‘Person_name‘
4.5 私有属性
带有一个下划线的私有属性,不是强制的,是约定俗成的,我们不去访问的,他只是一种规范,达不到真正的限制目的,就好像一家人外出,家里空无一人,在自己家里上了锁的,我们都有能力去撬了这把锁,但是我们都不会去这么干。带有两个下划线的也是私有属性,这种属性我们访问更加不容易,当然要去访问还是可以访问的。
class Person: # 在类里面定义类属性 name = "zgzeng" age = 23 # 添加私有属性 _hobby = "eating" __weight = "100kg" # 定义类方法,实质上就是定义在函数中定义一个函数 def func(self): print("hello world!!!") zgzeng = Person() # 访问hobby属性 print(zgzeng._hobby) # eating print(zgzeng.__weight) # ‘Person‘ object has no attribute ‘__weight‘
我们可以看到,我们可以去访问_hobby属性,但是访问不到__weight属性
# 查看person这个类下面的所有的属性 print(dir(Person)) # [‘_Person__weight‘, ‘__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__‘, ‘_hobby‘, ‘age‘, ‘func‘, ‘name‘]
我们可以查看到Person类下面的属性中,有一个‘-Perosn__weight‘和‘_hobby‘属性,如果我们真的想去访问weight属性,需要这么去访问
print(zgzeng._Person__weight) # 100kg
5. 类方法
类方法也就是在类里面定义的一些函数方法
class Person: # 在类里面定义类属性 name = "zgzeng" age = 23 # 定义类方法,实质上就是定义在函数中定义一个函数 def func(self): print("hello world!!!") # 实例化一个实例对象 zgzeng = Person() # 在类外面定义类属性 Person.height = "170cm" Person.weight = "55kg" # 在类外面定义实例属性 zgzeng.height = "180cm" zgzeng.weight = "60kg" # 实例对象访问类属性 print(zgzeng.name) # zgzeng print(zgzeng.age) # 23 # 实例对象访问实例属性 print(zgzeng.height) # 180cm print(zgzeng.weight) # 60kg
# 类方法的调用: instance.func() # 访问类方法,运用句点法,self代表的是实例本身,当用类去调用方法的时候,需要传入实例对象,因为类方法中传入了参数self zgzeng.func() # hello world!!! Person.func(zgzeng) # hello world!!!
标签:__init__ ini 私有 nbsp int height code sub eating
原文地址:https://www.cnblogs.com/zgzeng/p/12113257.html