zoukankan      html  css  js  c++  java
  • 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!!!
  • 相关阅读:
    DataTables 控件使用和心得 (2)
    dataTables 添加行内操作按钮
    datatables 配套bootstrap3样式使用小结(1)
    loadrunner总体使用篇
    使用CEF类库处理HTTP请求
    27部优秀的黑客纪录片
    CEF3开发者系列之进程和线程
    cef3的各个接口你知道几个
    [你必须知道的.NET]第二十九回:.NET十年(上)
    [你必须知道的.NET]第二十八回:说说Name这回事儿
  • 原文地址:https://www.cnblogs.com/zgzeng/p/12113257.html
Copyright © 2011-2022 走看看