首页 > 编程语言 >无涯教程-Python - 类/对象

无涯教程-Python - 类/对象

时间:2023-08-25 20:32:53浏览次数:53  
标签:__ 教程 Python self 无涯 print Employee class def

如果您以前没有使用面向对象(OO)编程的经验,则可能需要查阅有关它的入门课程或至少某种形式的教程,以便掌握基本概念。

创建类

class 语句创建一个新的类定义。该类的名称紧随关键字 class 后跟冒号,如下所示-

class ClassName:
   'Optional class documentation string'
   class_suite
  • 该类有一个文档字符串,可以通过 ClassName .__ doc __ 访问。

  • class_suite 由定义类成员,数据属性和函数的所有组件语句组成。

以下是一个简单的Python类的示例-

class Employee:
   'Common base class for all employees'
   empCount=0

   def __init__(self, name, salary):
      self.name=name
      self.salary=salary
      Employee.empCount += 1
   
   def displayCount(self):
     print "Total Employee %d" % Employee.empCount

   def displayEmployee(self):
      print "Name : ", self.name,  ", Salary: ", self.salary

创建实例对象

要创建类的,请使用类名称调用该类,然后传递其 __ init __ 方法接受的任何参数。

"This would create first object of Employee class"
emp1=Employee("Learnfk", 2000)
"This would create second object of Employee class"
emp2=Employee("Manni", 5000)

访问类属性

您可以使用带点运算符和对象来访问对象的属性。将使用类名称访问类变量,如下所示:

emp1.displayEmployee()
emp2.displayEmployee()
print "Total Employee %d" % Employee.empCount

现在,将所有概念放在一起-

#!/usr/bin/python

class Employee:
   'Common base class for all employees'
   empCount=0

   def __init__(self, name, salary):
      self.name=name
      self.salary=salary
      Employee.empCount += 1
   
   def displayCount(self):
     print "Total Employee %d" % Employee.empCount

   def displayEmployee(self):
      print "Name : ", self.name,  ", Salary: ", self.salary

"This would create first object of Employee class"
emp1=Employee("Learnfk", 2000)
"This would create second object of Employee class"
emp2=Employee("Manni", 5000)
emp1.displayEmployee()
emp2.displayEmployee()
print "Total Employee %d" % Employee.empCount

执行以上代码后,将产生以下输出-

Name :  Learnfk ,Salary:  2000
Name :  Manni ,Salary:  5000
Total Employee 2

您可以随时添加,删除或修改类和对象的属性-

emp1.age=7  # 添加“age”属性。
emp1.age=8  # 修改“age”属性。
del emp1.age  # 删除“age”属性。

除了使用普通语句访问属性外,还可以使用以下功能-

  • getattr(obj,name [,default])   - 访问对象的属性。

  • hasattr(obj,name)                       -  检查属性是否存在。

  • setattr(obj,name,value)          -   设置属性。如果属性不存在,则将创建它。

  • delattr(obj,name)                        -   删除属性。

hasattr(emp1, 'age')    # 如果存在“age”属性,则返回True
getattr(emp1, 'age')    # 返回“age”属性的值
setattr(emp1, 'age', 8) # 在8中设置属性“age”
delattr(empl, 'age')    # 删除属性“age”

内置属性

每个Python类都遵循以下内置属性,并且可以像其他任何属性一样使用点运算符来访问它们-

  • __ dict __          - 包含类名称空间的字典。

  • __ doc __          - 类文档字符串,如果未定义,则为无。

  • __ name __      - 类名。

  • __ module __   - 定义类的模块名称。在交互模式下,此属性为" __main__"。

  • __ bases __       - 包含基类的可能为空的元组,按基类在基类列表中的出现顺序排列。

对于上面的类,让无涯教程尝试访问所有这些属性-

#!/usr/bin/python

class Employee:
   'Common base class for all employees'
   empCount=0

   def __init__(self, name, salary):
      self.name=name
      self.salary=salary
      Employee.empCount += 1
   
   def displayCount(self):
     print "Total Employee %d" % Employee.empCount

   def displayEmployee(self):
      print "Name : ", self.name,  ", Salary: ", self.salary

print "Employee.__doc__:", Employee.__doc__
print "Employee.__name__:", Employee.__name__
print "Employee.__module__:", Employee.__module__
print "Employee.__bases__:", Employee.__bases__
print "Employee.__dict__:", Employee.__dict__

执行以上代码后,将产生以下输出-

Employee.__doc__: Common base class for all employees
Employee.__name__: Employee
Employee.__module__: __main__
Employee.__bases__: ()
Employee.__dict__: {'__module__': '__main__', 'displayCount':
<function displayCount at 0xb7c84994>, 'empCount': 2, 
'displayEmployee': <function displayEmployee at 0xb7c8441c>, 
'__doc__': 'Common base class for all employees', 
'__init__': <function __init__ at 0xb7c846bc>}

销毁对象

Python会自动删除不需要的对象以释放内存空间。 Python定期回收不再使用的内存块的过程称为垃圾收集。

Python的垃圾回收器在程序执行期间运行,并在对象的引用计数达到零时触发。对象的引用计数随指向它的别名数量的变化而变化。

当为对象分配新名称或将其放置在容器(列表,元组或字典)中时,其引用计数就会增加。当使用 del 删除对象,重新分配其引用或引用超出范围时,该对象的引用计数会减少。当对象的引用计数达到零时,Python会自动收集它。

a=40      # Create object <40>
b=a       # Increase ref. count  of <40> 
c=[b]     # Increase ref. count  of <40> 

del a       # Decrease ref. count  of <40>
b=100     # Decrease ref. count  of <40> 
c[0]=-1   # Decrease ref. count  of <40> 

通常,您不会注意到垃圾收集器何时销毁一个孤立并回收其空间。但是,一个类可以实现称为析构函数的特殊方法 __ del __(),该方法将在即将被销毁时调用。此方法可能用于清除使用的任何非内存资源。

这个__del __()析构函数输出将要销毁的的类名-

#!/usr/bin/python

class Point:
   def __init__( self, x=0, y=0):
      self.x=x
      self.y=y
   def __del__(self):
      class_name=self.__class__.__name__
      print class_name, "destroyed"

pt1=Point()
pt2=pt1
pt3=pt1
print id(pt1), id(pt2), id(pt3) # 打印obejcts的ID
del pt1
del pt2
del pt3

执行以上代码后,将产生以下输出-

3083401324 3083401324 3083401324
Point destroyed

注意-理想情况下,您应该在单独的文件中定义类,然后使用 import 语句将其导入主程序文件中。

继承

子类继承其父类的属性,您可以在子类中使用父类的这些属性。子类也可以覆盖父类的数据成员和方法。

子类的声明与父类很相似;但是,在类名称后给出了要继承的父类列表-

class SubClassName (ParentClass1[, ParentClass2, ...]):
   'Optional class documentation string'
   class_suite
#!/usr/bin/python

class Parent:        # define parent class
   parentAttr=100
   def __init__(self):
      print "Calling parent constructor"

   def parentMethod(self):
      print 'Calling parent method'

   def setAttr(self, attr):
      Parent.parentAttr=attr

   def getAttr(self):
      print "Parent attribute :", Parent.parentAttr

class Child(Parent): # define child class
   def __init__(self):
      print "Calling child constructor"

   def childMethod(self):
      print 'Calling child method'

c=Child()            # instance of child
c.childMethod()      # child calls its method
c.parentMethod()     # calls parent's method
c.setAttr(200)       # again call parent's method
c.getAttr()          # again call parent's method

执行以上代码后,将产生以下输出-

Calling child constructor
Calling child method
Calling parent method
Parent attribute : 200

类似地,您可以从多个父类驱动一个类,如下所示:

class A:        # define your class A
.....

class B:         # define your class B
.....

class C(A, B):   # subclass of A and B
.....

您可以使用issubclass()或isinstance()函数来检查两个类和之间的关系。

方法覆盖

您可以覆盖父类方法。覆盖父级方法的原因之一是因为父类的方法实现满足不了你当前的需求。

#!/usr/bin/python

class Parent:        # define parent class
   def myMethod(self):
      print 'Calling parent method'

class Child(Parent): # define child class
   def myMethod(self):
      print 'Calling child method'

c=Child()          # instance of child
c.myMethod()         # child calls overridden method

执行以上代码后,将产生以下输出-

Calling child method

下表列出了一些通用功能,您可以在自己的类中覆盖它们-

Sr.No. Method, 描述 & Sample Call
1

__ init__(self [,args ...])

构造函数(带有任何可选参数)

用例: obj=className(args)

2

__del__(self)

析构函数,删除一个对象

示例:del obj

3

__ repr __(self)

可判断的字符串表示形式

示例: repr(obj)

4

__ str __(self)

可打印的字符串表示

示范: str(obj)

5

__ cmp__(self,x)

对象比较

示例: cmp(obj,x)

重载运算符

您可以在类中定义 __ add __ 方法以执行矢量加法,然后plus运算符将按照预期的方式工作-

#!/usr/bin/python

class Vector:
   def __init__(self, a, b):
      self.a=a
      self.b=b

   def __str__(self):
      return 'Vector (%d, %d)' % (self.a, self.b)
   
   def __add__(self,other):
      return Vector(self.a + other.a, self.b + other.b)

v1=Vector(2,10)
v2=Vector(5,-2)
print v1 + v2

执行以上代码后,将产生以下输出-

Vector(7,8)

数据隐藏

在类定义之外,对象的属性可能不可见。您需要使用双下划线前缀来命名属性,这样外部人就无法直接看到这些属性。

#!/usr/bin/python

class JustCounter:
   __secretCount=0
  
   def count(self):
      self.__secretCount += 1
      print self.__secretCount

counter=JustCounter()
counter.count()
counter.count()
print counter.__secretCount

执行以上代码后,将产生以下输出-

1
2
Traceback (most recent call last):
   File "test.py", line 12, in <module>
      print counter.__secretCount
AttributeError: JustCounter instance has no attribute '__secretCount'

Python通过内部更改名称以包括类名称来保护这些成员。您可以访问 object._className__attrName 这样的属性。

.........................
print counter._JustCounter__secretCount

执行以上代码后,将产生以下输出-

1
2
2

参考链接

https://www.learnfk.com/python/python-classes-objects.html

标签:__,教程,Python,self,无涯,print,Employee,class,def
From: https://blog.51cto.com/u_14033984/7234895

相关文章

  • python实现rpc
    RPC(RemoteProcedureCall)是指远程过程调用,也就是说两台服务器A,B一个应用部署在A服务器上,想要调用B服务器上应用提供的函数或方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据为什么要用RPC就是无法在一个进程内,甚至一个计算机内通......
  • 翻译python keyboard模块的说明文档
    之前有介绍过全局热键keyboard库,简略介绍了它的使用.为全面了解,我把其说明文档翻译了一下,如下(中英文对照):Thisprojectiscurrentlyunmaintained.Itworksformanycases,andIwishtopickitupagaininthefuture,butyoumightencountersomefrictionan......
  • python练习题01 碱基统计
     001、测试序列,碱基序列保存只a.fa文件中,统计下面这段序列中A、C、G、T碱基的个数[root@PC1test01]#lsa.fa[root@PC1test01]#cata.fa##测试fasta文件AGCTTTTCATTCTGACTGCAACGGGCAATATGTCTCTGTGTGGATTAAAAAAAGAGTGTCTGATAGCAGC 002、利用基本循环统计[ro......
  • VSCode使用JavaScript刷LeetCode配置教程(亲试可以!)
    账号秘密都对,但是缺登录不成功的问题诀窍可能是:在属性设置中把LeetCode版本改成cn。点击LeetCode配置,修改Endpoint配置项,改成leetcode-cn,再次尝试登陆即可。  大家可移步原博文:https://blog.csdn.net/qq_37263248/article/details/124304402......
  • bh006- Blazor hybrid / Maui 使用NFC快速教程
    1.建立工程bh006_NFC_tag源码https://github.com/densen2014/BlazorHybrid/tree/master/bh100days/bh006_NFC_tag?WT.mc_id=DT-MVP-50050782.添加nuget包<PackageReferenceInclude="BlazorHybrid.Maui.Permissions"Version="0.0.3"/><Packag......
  • Python数据类型
    Python数据类型字符串(str)字符串是Python中最常用的数据类型。我们可以使用引号('或"或''')来创建字符串。创建字符串很简单,只要为变量分配一个值即可。var1='HelloWorld!'var2="PythonRunoob"字符串的截取的语法格式:变量[头下标:尾下标]str='Runoo......
  • 如何修改Esxi主机的时间图文教程
    还需要注意的是esxi主机的时间问题,本人调试过,实际已经在vSphereClient修改了时间,并且开启了NTP服务,时间也是对的,但是在ssh终端执行:执行date命令,发现时间和时区都是不对的。接下来我们就解决这个问题解决方法:1、从其他一台Linux主机拷贝一个/usr/share/zoneinfo/Asia/Shanghai文件......
  • 无涯教程-Python - 模块语句
    模块使您可以逻辑地组织Python代码。将相关代码分组到一个模块中可以使代码更易于理解和使用。名为aname的模块的Python代码通常位于名为aname.py的文件中。这是一个简单模块support.py的示例defprint_func(par):print"Hello:",parreturnImport语句您可......
  • centos7实现开机自启动Python脚本
    在Linux系统中,你可以使用不同的方法来实现开机自启动Python脚本和确保守护进程不挂掉。以下是一些常用的方法:1.开机自启动Python脚本:使用rc.local文件(适用于一些旧的系统):编辑/etc/rc.local文件,将你希望在系统启动时运行的命令或脚本添加到文件中。确保给脚本提供正确的路径。......
  • 软件测试|数据处理神器pandas教程(十三)
    Pandas迭代方法进行数据遍历和操作在数据处理和分析中,经常需要对数据进行遍历和操作。Pandas是Python中用于数据处理和分析的强大库,提供了多种迭代方法来处理数据。本文将介绍Pandas中的迭代方法,并展示它们在数据处理中的应用。引言在数据处理中,遍历数据是一项常见任务,用于访......