码迷,mamicode.com
首页 > 编程语言 > 详细

python-类

时间:2020-01-12 11:32:35      阅读:65      评论:0      收藏:0      [点我收藏+]

标签:__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!!!

python-类

标签:__init__   ini   私有   nbsp   int   height   code   sub   eating   

原文地址:https://www.cnblogs.com/zgzeng/p/12113257.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!