今天我们来聊一下有关Python中类的定义与实例化的问题。
一.Python中类的定义
Python中定义类的基本格式为:
class 类名:
def __init__(self,参数1,参数2,……):
self.属性名1 = 参数1
self.属性名2 = 参数2
...
def 方法1: #方法即类中的函数
...
def 方法2:
...
...
例如:
#定义一个Student类,属性有name和age,利用方法message输出学生信息
class Student:
def__init__(self,name,age):
self.name = name
self.age = age
def message():
print(f'{self.name} is {age} years old')
关于上述定义的几点说明:
1.类名需采用驼峰命名法,即类名中每个单词的首字母都要大写,而不采用下划线,实例以及模块则采用小写形式;
2.上述定义中,形参self必不可少,且必须位于其它参数前面。在Python调用上述方法创建实例时,将自动传入实参self,后续每个与实参相关的操作都将自动传入实参self,此时,self是一个指向实例的引用,实例因此得以访问类中的属性与方法;
3.属性默认值的指定:
可以在初始化属性的过程中,采用'self.属性名 = 默认值'的方式进行,或者在__init__(self,)中直接输入‘参数 = 默认值’(可以但没必要,不如上一种方法简洁)。
3.__init __是一个特殊函数,左右两边各有两个下划线,当你利用上述定义的类创建一个实例时,Python会自动调用他,用以传递实参self.
二.Python中类的实例化
类的实例化即根据类来创建一个或多个对象。其基本格式为:
对象名称 = 类名(self,实参1,实参2,……)
创建的实例可以通过'实例名.属性名(方法名)'的格式来调用类中的属性与方法。
注意:实例化时,上述格式中的self可以省略,Python将自动传入self。
我们采用上面定义的类来实例化一个student1对象:
student1 = Student('XiaoMing',20)
print(student1.name)
student1.message()
属性值的修改:
(1)直接修改属性值:
实例名称.属性名 = 值
(2)通过类中的方法修改属性值:
可以通过在类中定义一个方法,实例化后调用该方法,来修改属性值。
我们在Student类中添加如下属性与方法:
self.height = 180
def change_height(self,height):
self.height = height
实例化后修改height为185:
方法(1)
student1.height = 185
方法(2)
student1.change_height(185)
注意:上述两种方法仅能改变当前实例的值,如果新建一个实例student2,而不去进行上述修改属性的操作,student2.height仍然为180.
前人栽树,后人乘凉。本人在编写上述内容时也是查阅了不少资料,学到了不少东西。在这里分享给大家,希望我们一起进步,也欢迎大家讨论。
我正在尝试设置一个puppet节点,但rubygems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由rubygems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer
我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击
在我的应用程序中,我需要能够找到所有数字子字符串,然后扫描每个子字符串,找到第一个匹配范围(例如5到15之间)的子字符串,并将该实例替换为另一个字符串“X”。我的测试字符串s="1foo100bar10gee1"我的初始模式是1个或多个数字的任何字符串,例如,re=Regexp.new(/\d+/)matches=s.scan(re)给出["1","100","10","1"]如果我想用“X”替换第N个匹配项,并且只替换第N个匹配项,我该怎么做?例如,如果我想替换第三个匹配项“10”(匹配项[2]),我不能只说s[matches[2]]="X"因为它做了两次替换“1fooX0barXg
我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢
我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby1.9+ 关于ruby-主要:Objectwhenrun
我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin
我有一个只接受一个参数的方法:defmy_method(number)end如果使用number调用方法,我该如何引发错误??通常,我如何定义方法参数的条件?比如我想在调用的时候报错:my_method(1) 最佳答案 您可以添加guard在函数的开头,如果参数无效则引发异常。例如:defmy_method(number)failArgumentError,"Inputshouldbegreaterthanorequalto2"ifnumbereputse.messageend#=>Inputshouldbegreaterthano
我有一个正在构建的应用程序,我需要一个模型来创建另一个模型的实例。我希望每辆车都有4个轮胎。汽车模型classCar轮胎模型classTire但是,在make_tires内部有一个错误,如果我为Tire尝试它,则没有用于创建或新建的activerecord方法。当我检查轮胎时,它没有这些方法。我该如何补救?错误是这样的:未定义的方法'create'forActiveRecord::AttributeMethods::Serialization::Tire::Module我测试了两个环境:测试和开发,它们都因相同的错误而失败。 最佳答案