类
<p>[toc]</p>
<h3>类(class)</h3>
<p>定义了事务的属性和它可以做到的行为。</p>
<h4>对象(object)</h4>
<p>类的实例,系统给对象分配内存空间,不会给类分配内存空间。</p>
<h5>成员变量</h5>
<ul>
<li>类中定义成员变量message,并赋予初始值。</li>
<li>成员函数,self是对象本身引用,成员函数引用self参数获取对象信息。</li>
</ul>
<pre><code class="language-python">class ObjectDemo:
# 类成员变量
message = "Hello, send a message."
def show(self):
print('func: ',self.message)
if __name__ == '__main__':
print('初始化值: ', ObjectDemo.message)
# 修改成员变量
ObjectDemo.message = "Hello, message is changed."
print('修改后值: ', ObjectDemo.message)
# 实例化对象
run = ObjectDemo()
run.show()</code></pre>
<p>结果:</p>
<pre><code>初始化值: Hello, send message.
修改后值: Hello, message is changed.
func: Hello, message is changed.</code></pre>
<h5>构造函数</h5>
<p>创建对象时初始化对象,实例化时被python解释器自动调用。</p>
<pre><code class="language-python">class ObjectDemo:
def __init__(self, name = 'unset', day = ''):
"""
:desc: 构造函数,自动调用
"""
print(name, ',', day, ': Hello, __init__')
# 调用
ObjectDemo(name = 'Bohemian', singer= 'today')</code></pre>
<h5>析构函数</h5>
<p>销毁实例化对象,当对象没有被引用时(引用计数为0),由垃圾回收器调用<strong>del</strong>方法,进行销毁释放内存。</p>
<pre><code class="language-python">class ObjectDemo:
def __del__(self):
print('called')
if __name__ == '__main__':
run = ObjectDemo()
result = ObjectDemo()
print("end")</code></pre>
<p>返回</p>
<pre><code>end
called
called</code></pre>
<p>当插入del obj</p>
<pre><code class="language-python">if __name__ == '__main__':
run = ObjectDemo()
result = ObjectDemo()
del result
print("end")</code></pre>
<p>返回</p>
<pre><code>called
end
called</code></pre>
<h5>成员变量</h5>
<p>成员函数可以直接使用,通过实例也可以访问到。</p>
<pre><code class="language-python">class ObjectDemo:
# 类成员变量
message = "Hello, I'm message."
def show(self):
print(self.message)
def __init__(self, name = 'unset', day = ''):
print(name, ",", day,": Hello, __init__")
# 实例成员变量
self.name = name
self.day = day
def __del__(self):
print('called', self.name)
if __name__ == '__main__':
run_2 = ObjectDemo(name = 'Bohemian', day = 'today')
print('name: ', run_2.name)</code></pre>
<p>返回</p>
<pre><code>Bohemian , today : Hello, __init__
name: Bohemian
called Bohemian</code></pre>
<h5>静态函数</h5>
<p>装饰器staticmethod,不需要传入self,不能直接访问实例变量,需要通过类名访问成员变量。</p>
<pre><code class="language-python">class ObjectDemo:
@staticmethod
def printMessage():
"""
:desc: 静态函数,从属于一个类
"""
print("staticmethod")
# 通过类名访问成员变量
print(ObjectDemo.message)
if __name__ == '__main__':
# 类调用
ObjectDemo.printMessage()
# 类对象调用
ObjectDemo().printMessage()</code></pre>
<h5>类函数</h5>
<p>装饰器classmethod,参数cls, 不需要实例化,不需要self,可以来调用类的属性,类的方法,实例化对象等。</p>
<pre><code class="language-python">class ObjectDemo:
@classmethod
def createObj(cls, name, day):
"""
:cls: 隐性参数,获取类信息
"""
print("object create %s(%s, %s)" % (cls.__name__, name, day))
return(cls(name, day))
if __name__ == '__main__':
# 类调用
ObjectDemo.createObj('Bohemian', 'today')
# 类对象调用
run_3 = ObjectDemo().createObj('Bohemian', 'today')</code></pre>
<h5>私有成员</h5>
<p>"__"开头命名的的成员,类之外的代码无法访问,</p>
<pre><code class="language-python">class ObjectDemo:
def __init__(self, name = 'unset', day = ''):
print(name, ",", time, ": Hello, __init__")
# 实例成员变量
self.name = name
self.day = day
#私有成员
self.__name = name
self.__day = day
def __del__(self):
print('called', self.__name)
if __name__ == '__main__':
try:
run_4 = ObjectDemo()
print(run_4.__name)
except Exception as e:
print("__name : ",str(e))</code></pre>
<p>返回</p>
<pre><code>__name end: 'ObjectDemo' object has no attribute '__name'</code></pre>
<h5>代码demo</h5>
<pre><code class="language-python"># -*- coding:utf-8 -*-
"""
@author:
@file: demo_.py
@time: 2022/9/25 14:38
@desc:
"""
class ObjectDemo:
# 类成员变量
message = "Hello, send a message."
def show(self):
"""
:desc: 成员函数,self是对象本身引用,成员函数引用self参数获取对象信息
"""
print(self.message)
def __init__(self, name = 'unset', day = ''):
"""
:desc: 构造函数,自动调用
"""
print(name, ",", day, ": Hello, __init__")
# 实例成员变量
self.name = name
self.day = day
#私有成员, 类之外的代码无法访问
self.__name = name
self.__day = day
@staticmethod
def printMessage():
"""
:desc: 静态函数,从属于一个类
"""
print("staticmethod")
# 通过类名访问成员变量
print(ObjectDemo.message)
@classmethod
def createObj(cls, name, day):
"""
:cls: 隐性参数,获取类信息
:desc: 类函数
"""
print("object create %s(%s, %s)" % (cls.__name__, name, day))
return(cls(name, day))
def __del__(self):
"""
:desc: 析构函数,释放对象调用
"""
# print('called', self.name)
print('called', self.__name)
if __name__ == '__main__':
run = ObjectDemo(day= 'today')
run.show()
# 修改成员变量
ObjectDemo.message = "Hello, message is changed."
print(ObjectDemo.message)
# 传参
# run_2 = ObjectDemo(singer= 'Queen')
run_2 = ObjectDemo(name = 'Bohemian', day = 'today')
# run_2 = ObjectDemo('Bohemian Rhapsody')
run_2.show()
#
print('name of day: ', run.day)
print('name of run_2: ', run_2.name)
# staticmethod 类调用
ObjectDemo.printMessage()
# staticmethod 类对象调用
ObjectDemo().printMessage()
# classmethod 类调用参数
run_3 = ObjectDemo.createObj('Bohemian', 'today')
# classmethod 类对象调用
run_3 = ObjectDemo().createObj('Bohemian', 'today')
# 私有成员
try:
run_4 = ObjectDemo()
print(run_4.__name)
except Exception as e:
print("私有成员__name: ",str(e))</code></pre>
<h4>继承</h4>
<h5>方法</h5>
<p>子类会继承父类的属性和方法。</p>
<pre><code class="language-python">class EmployeeObject:
def __init__(self, name, id):
self.name = name
self.id = id
def print_info(self):
print('员工名字: %s, 员工id: %s' % (self.name, self.id))
class FullTimeEmployee(EmployeeObject):
def print_info(self):
print('fulltime')
class PartTimeEmployee(EmployeeObject):
def print_info(self):
print('partime')
# 实例化
part = PartTimeEmployee('Max', '10002')
part.print_info()</code></pre>
<p>实例具有name, id属性,调用print_info是父类的方法。</p>
<pre><code class="language-python">class PartTimeEmployee(EmployeeObject):
def print_info(self):
print('partime')
def print_info(self):
print('兼职员工名字: %s, 员工id: %s' % (self.name, self.id))</code></pre>
<p>子类有自己的print_info方法,就会调用自己的。优先看所属的类有没有该方法,没有的话,往上找同名的父类方法。</p>
<pre><code class="language-python">class FullTimeEmployee(EmployeeObject):
def __init__(self, name, id, monthly_salary):
super().__init__(name, id)
self.monthly_salary = monthly_salary</code></pre>
<p>创建子类实例时,子类的构造函数优先调用。导致实例只有monthly_salary方法。用super方法,会返回当前类的父类。</p>
<h5>代码demo</h5>
<pre><code class="language-python"># -*- coding:utf-8 -*-
"""
@author:
@file: employee.py
@time: 2022/9/26 22:16
@desc:
"""
class EmployeeObject:
def __init__(self, name, id):
self.name = name
self.id = id
def print_info(self):
print('员工名字: %s, 员工id: %s' % (self.name, self.id))
class FullTimeEmployee(EmployeeObject):
def __init__(self, name, id, monthly_salary):
super().__init__(name, id)
self.monthly_salary = monthly_salary
def calculate_monthly_pay(self):
return self.monthly_salary
class PartTimeEmployee(EmployeeObject):
def __init__(self, name, id, daily_salary, work_days):
super().__init__(name, id)
self.daily_salary = daily_salary
self.work_days = work_days
def calculate_monthly_pay(self):
monthly_salary = int(self.work_days) * int(self.daily_salary)
return monthly_salary
if __name__ == '__main__':
# 实例化
Tom = FullTimeEmployee('Tom', '10001', 4000)
Max = PartTimeEmployee('Max', '10002', 200, 15)
# 调用父类方法
Tom.print_info()
Max.print_info()
# 调用子类方法
print(Tom.calculate_monthly_pay())
print(Max.calculate_monthly_pay())
</code></pre>