python-类

类(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

 或者通过方法return出私有属性

# 私有属性和封装
class Person:
    def __init__(self, name, id_card):
        self.name = name
        self.__id_card = id_card

    # 间接获得私有属性的办法
    def get_id_card(self):
        return self.__id_card

  # 修改私有变量
  def set_id_card(self, id_card):
    self.__id_card = id_card

zgzeng = Person("zgzeng", 2820482)
lry = Person("lry", 1828393)
print(zgzeng._Person__id_card)
print(zgzeng.demo())

运行结果:
2820482

 

5. 类方法

类方法也就是在类里面定义的一些函数方法

class Chinese:
    # 类变量,不会随着对象不同而发生改变
    country = "中华人民共和国"
    def __init__(self, name, place):
        # 实力变量,随着每个对象的不同会发生改变的东西
        self.name = name
        self.place = place

    # 定义一个类方法,不会随着对象的改变而改变,并且保存在类空间,优化内存空间
    @classmethod
    def say_fighting(cls):
        print("我是中国人,我为我的祖国加油")

    # 定义一个实例方法,会随着对象的不同而发生改变
    def myself(self):
        print(f"我是{self.name},我来自{self.place}")


zgzeng = Chinese("zgzeng", "江西")
Chinese.say_fighting()
zgzeng.say_fighting()
zgzeng.myself()


运行结果:

我是zgzeng, 我是一个男人, 我来自jian,我今天很开心
我是lry, 我是一个女人, 我来自jian,我今天很开心
我是中国人,我为我的祖国加油
我是中国人,我为我的祖国加油
我是zgzeng,我来自江西

 

实例方法

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!!!
posted @ 2020-01-12 09:18  zgzeng  阅读(130)  评论(0编辑  收藏  举报