zoukankan      html  css  js  c++  java
  • 类的特性

    一、概述

    类:可以理解为他是一个模板,比如人们在说“人”这个名词的时候,没人知道这个“人”具体是指那个人!

    对象: 对象是一个实际的物体,他有自己的属性和特征、行为。比如说 韩梅梅这样一个具体的人。

    1.定义类(class Dog(object))--> 实例化(d = Dog())---> 实例对象(d)

    2. __init__() 构造函数

    3. self.name = name  类的属性、成员变量

    4. def say_hi()   类的方法 、动态属性

    二、访问类的属性

    class Role(object):
        def __init__(self, name, role, weapon, life_value=100, money=15000):
            self.name = name
            self.role = role
            self.weapon = weapon
            self.life_value = life_value
            self.money = money
    
        def shot(self):
            print("%s is shooting..." % self.name)
    
        def got_shot(self):
            print("ah...,%s got shot..." % self.name)
    
        def buy_gun(self, gun_name):
            print("%s just bought %s" % (self.name,gun_name))
    
    
    r1 = Role('Alex', 'police', 'AK47')  # 生成一个角色
    r2 = Role('Jack', 'terrorist', 'B22')   # 生成一个角色
    

      

      2.1 访问类的属性和方法

      我们用 实例对象.属性/方法 来访问

    r1.shot()    #  调用shot 方法
    r2.buy_gun('B13')  # 调用 buy_gun的方法并传参
    print(r1.role)   # 打印类的属性
    
    # 输出
    
    Alex is shooting...
    Jack just bought B13
    police
    

     

      2.1 修改对象的属性

      在上例中我们为r2这个角色更换了武器,即 B22 --> B13。但实际上我们调用r2这个角色的武器属性是,会发现他的武器没有改变:

    r2.buy_gun('B13')
    print(r2.weapon)
    
    # 输出
    Jack just bought B13
    B22       # 可以发现武器依然是 B22
    

      其实我们可以在购买武器是直接改变对象的属性:

    def buy_gun(self, gun_name):
          print("%s just bought %s" % (self.name, gun_name))
          self.weapon = gun_name    # 在方法内改变属性
    
    
    
    r2.buy_gun('B13')
    print(r2.weapon)
    
    #输出
    Jack just bought B13
    B13    # 可以发现武器已经改变
    

      

    三、私有属性

      3.1、定义私有属性

       类的属性一旦被定义成私有属性,就不能被外部调用和随意修改。私有属性只能在类是内部使用。

    class Person(object):
    
        def __init__(self, name, job, phone, address):
            self.name = name
            self.job = job
            self.phone = phone
            self.__address = address   # 定义一个私有属性
    
        def sayhi(self):
            print("hell,%s" % self.name)
    
    p1 = Person('Bigberg', 'Doctor', '8833421', 'hz')
    print(p1.name)
    print(p1.__address)   # 访问私有属性
    
    # 输出
    
    Bigberg
      File "G:/python/untitled/study6/类的私有属性.py", line 17, in <module>
        print(p1.__address)
    AttributeError: 'Person' object has no attribute '__address'
    

      运行的结果是访问属性name是可以通过的,但是直接访问私有属性 self.__address 报错了。但是如果通过其他的方法,还是可以访问的到的。

      3.2、get的方法访问私有属性

      外部不能直接访问私有属性,但是在类的内部可以访问,所以我们可以定义一个方法来获取私有属性。  

    class Person(object):
    
        def __init__(self, name, job, phone, address):
            self.name = name
            self.job = job
            self.phone = phone
            self.__address = address
    
        def get_private(self):
            return self.__address
    
        def sayhi(self):
            print("hell,%s" % self.name)
    
    p1 = Person('Bigberg', 'Doctor', '8833421', 'hz')
    res = p1.get_private()
    print(res)
    
    # 输出
    hz
    

      

      3.3 强制访问私有属性

      我们还可以通过一种方法来强制访问私有属性,甚至修改私有属性的值。方法:对象名._类名__属性名。

    class Person(object):
    
        def __init__(self, name, job, phone, address):
            self.name = name
            self.job = job
            self.phone = phone
            self.__address = address
    
        def get_private(self):
            return self.__address
    
        def sayhi(self):
            print("hell,%s" % self.name)
    
    p1 = Person('Bigberg', 'Doctor', '8833421', 'hz')
    
    print(p1._Person__address)   # 访问私有属性
    
    print("----change----")
    p1._Person__address = 'BJ'    # 修改私有属性
    print(p1._Person__address)
    
    #输出
    hz
    ----change----
    BJ
    

      

    四、总结

    1、定义私有属性:self.__private_attr_name = private_attr_name

    2、强制访问私有属性:对象名._类名__属性名(d._dog__sex)

    3、对外提供只读接口访问:

        def get_sex(self):

          return self.__sex

  • 相关阅读:
    简体中文和繁体中文的转换
    EasyPoi 快速Office 开发
    玩转SpringBoot之定时任务详解
    Spring Boot中使用Swagger2构建强大的RESTful API文档
    一篇文章带你搞懂 SpringBoot与Swagger整合
    JAVA团队开发手册
    CentOS(6、7)修改主机名(hostname)
    SpringBoot多环境部署,在启动时动态设置相应的配置文件
    MyBatis逆向工程代码的生成以及使用详解(持续更新)
    MySQL写入插入数据优化配置
  • 原文地址:https://www.cnblogs.com/bigberg/p/7152228.html
Copyright © 2011-2022 走看看