细说Ruby里的public、protected和private

本文详细解析了Ruby中public、protected及private方法的区别与使用场景,包括它们如何被类及其子类访问,以及实例对象对这些方法的调用限制。
首先来看这段代码:
class Test    
  def method_public
    puts  "In method_public"    
  end  
 
  def method_protected
    puts "In method_protected"     
  end  
 
  def method_private
    puts "In method_private"   
  end
 
  protected :method_protected
  private   :method_private
end

test=Test.new

分别尝试:

        test.method_public
        输出:In method_public

        test.method_protected
        输出:test.rb:20: protected method `method_protected' called for #<Test:0x3756068> (NoMethodError)

        test.method_private

        输出:test.rb:21: private method `method_private' called for #<Test:0x346070> (NoMethodError)

可知:public能被实例对象调用,protected和private不能被实例对象直接调用。

改写代码:

class Test    
  def method_public
    puts  "In method_public" 
  end
  
  def method_protected
    puts "In method_protected"     
  end  
  
  def method_private
    puts "In method_private"   
  end
 
  protected :method_protected
  private     :method_private
  
  def access_method
    puts method_public
    puts method_protected    
    puts method_private
  end
  
end

test = Test.new
test.access_method
        输出:

        In method_public
        nil
        In method_protected
        nil
        In method_private
        nil

可知:三种方式都能被定义它们的类访问。

改写代码:

class Test    
  def method_public
    puts  "In method_public" 
  end
  
  def method_protected
    puts "In method_protected"     
  end  
  
  def method_private
    puts "In method_private"   
  end
 
  protected :method_protected
  private   :method_private
end

class SonTest < Test
  def access_method
    puts method_public
    puts method_protected    
    puts method_private
  end
end

test = SonTest.new
test.access_method
        输出:

       In method_public
       nil
       In method_protected
       nil
       In method_private
       nil
可知:三种方法都能被定义它们的类的子类访问。

改写代码:

class Test    
  def method_public
    puts  "In method_public" 
  end
  
  def method_protected
    puts "In method_protected"     
  end  
  
  def method_private
    puts "In method_private"   
  end
 
  protected :method_protected
  private   :method_private
  
  def call_method_protected(testmember)
    puts testmember.method_protected
  end
  def call_method_private(testmember)
    puts testmember.method_private
  end
  
end

test1 = Test.new
test2 = Test.new
分别尝试:

       test2.call_method_protected(test1)

       输出:

       In method_protected
       nil

       test2.call_method_private(test1)

       输出:test.rb:21:in `call_method_private': private method `method_private' called for #<Test:0x36c5af4> (NoMethodError)

可知:protected方法可以被其他的实例对象访问,而private方法只能被自己的实例对象访问。


总结一下


public方法可以被定义它的类子类访问,并可以被类和子类的实例对象调用;

protected方法可以被定义它的类子类访问,不能被类和子类的实例对象调用,但可以被该类的实例对象(所有)访问;

private方法可以被定义它的类子类访问,不能被类和子类的实例对象调用,且实例对象只能访问自己的private方法。


以上的陈述中,请注意“调用”和“访问”的区别。

<think>我们已经在之前的对话中介绍了platform模块的概述常用函数。现在,用户要求详细介绍该模块内的函数。根据引用[1][2][3],我们将更详细地介绍platform模块中的各个函数,包括它们的语法、返回值使用示例。 注意:我们需要按照系统级指令的要求,使用正确的LaTeX格式,添加引用标记,并生成相关问题。同时,使用中文回答。 接下来,我们将详细列出platform模块的主要函数,并逐一说明。 </think>### Python platform模块函数详解 `platform`模块提供了丰富的函数用于获取系统级信息,以下按功能分类详细介绍核心函数及用法示例。所有函数均为内置函数,无需额外安装[^1][^2]。 --- #### **1. 操作系统识别** | 函数 | 返回值 | 示例输出 | |------|--------|----------| | `platform.system()` | 操作系统名称 | `'Windows'`, `'Linux'`, `'Darwin'` | | `platform.release()` | 操作系统版本号 | `'10'` (Windows 10) | | `platform.version()` | 详细系统版本 | `'10.0.19045'` | | `platform.platform()` | 完整平台标识 | `'Windows-10-10.0.19045-SP0'` | | `platform.win32_edition()` | Windows版本类型 | `'Professional'`, `'Server'` | | `platform.mac_ver()` | macOS版本信息 | `('10.15.7', ('', '', ''), 'x86_64')` | **示例代码**: ```python import platform print(f"系统: {platform.system()} {platform.release()}") # 输出: 系统: Windows 10 print(f"完整标识: {platform.platform()}") # 输出: Windows-10-10.0.19045-SP0 ``` --- #### **2. 硬件架构与处理器** | 函数 | 返回值 | 说明 | |------|--------|------| | `platform.machine()` | 硬件架构 | `'AMD64'`, `'x86_64'`, `'armv7l'` | | `platform.processor()` | 处理器型号 | `'Intel64 Family 6 Model 158'` | | `platform.architecture()` | (位数, 链接格式) | `('64bit', 'WindowsPE')` | | `platform.uname()` | 系统信息元组 | 包含6个属性:`system`, `node`, `release`, `version`, `machine`, `processor` | **示例代码**: ```python arch, linkage = platform.architecture() print(f"架构: {platform.machine()} {arch}位") # 输出: 架构: AMD64 64位 print(f"处理器: {platform.processor()}") # 输出: Intel(R) Core(TM) i7-10750H ``` --- #### **3. Python解释器信息** | 函数 | 返回值 | 说明 | |------|--------|------| | `platform.python_version()` | Python版本 | `'3.9.13'` | | `platform.python_version_tuple()` | 版本元组 | `('3', '9', '13')` | | `platform.python_compiler()` | 编译器信息 | `'GCC 9.4.0'`, `'MSC v.1929'` | | `platform.python_implementation()` | 解释器类型 | `'CPython'`, `'PyPy'`, `'Jython'` | | `platform.python_build()` | 构建号与日期 | `('main', 'Jan 01 2023 10:00:00')` | **示例代码**: ```python print(f"Python版本: {platform.python_version()}") # 输出: 3.9.13 print(f"编译器: {platform.python_compiler()}") # 输出: MSC v.1929 64 bit (AMD64) ``` --- #### **4. 网络与主机信息** | 函数 | 返回值 | 说明 | |------|--------|------| | `platform.node()` | 主机网络名称 | `'DESKTOP-ABC123'` | | `platform.freedesktop_os_release()` | Linux桌面环境信息 | 返回字典 (仅Linux) | **示例代码**: ```python print(f"主机名: {platform.node()}") # 输出: DESKTOP-ABC123 ``` --- #### **5. 高级函数** | 函数 | 说明 | |------|------| | `platform.libc_ver()` | 获取libc版本 (Linux) | | `platform.java_ver()` | Jython环境Java版本 | | `platform.dist()` | 已弃用 (旧版Linux发行版信息) | --- #### **使用场景示例** ```python import platform # 跨平台路径处理 if platform.system() == 'Windows': data_path = r'C:\ProgramData\app' else: data_path = '/var/lib/app' # 版本兼容性检查 if platform.python_version_tuple() < ('3', '8'): print("警告: 需要Python 3.8+") ``` --- #### **注意事项** 1. **函数兼容性** - `platform.processor()`在部分ARM设备返回空值 - macOS Mojave+需授权才能获取完整主机名[^3] 2. **性能优化** 避免在循环中调用函数(如`platform.python_version()`),建议预先存储结果: ```python PYTHON_VERSION = platform.python_version() # 一次性获取 ``` 3. **错误处理** 使用`try-except`捕获平台相关异常: ```python try: print(platform.mac_ver()[0]) except AttributeError: print("非macOS系统") ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值