python的类机制

python的类机制

参考:python面向对象

概念

  1. 方法重写/覆盖:若从父类继承的方法不能满足子类的需求,可以对其进行改写。
  2. 类变量:在实例化对象中是公用的,定义在类中,且在函数体之外,通常不作为实体变量使用。
  3. 局部变量:定义在方法中的变量,只作用在当前实例。
  4. 实例变量:在类的声明中,属性是用变量表示的,用self修饰。
  5. 继承关系:派生对象”是一个“继承对象,例如Dog是一个Animal。
  6. 对象:通过类定义的数据结构实例,包含类变量、实例变量和方法。

类属性

  1. 私有属性

两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。例如:__private_attrs,在类内部的方法中使用时 self.__private_attrs

  1. 私有方法

两个下划线开头,声明该方法为私有方法,只能在类的内部调用 ,不能在类的外部调用。例如:__private_methods,使用方法:self.__private_methods。

#!/usr/bin/python3
 
class JustCounter:
    __secretCount = 0  # 私有变量
    publicCount = 0    # 公开变量
 
    def count(self):
        self.__secretCount += 1
        self.publicCount += 1
        print (self.__secretCount)
 
counter = JustCounter()
counter.count()
counter.count()
print (counter.publicCount)
print (counter.__secretCount)  # 报错,实例不能访问私有变量

专有方法

image-20240219223255800

类对象

支持2种操作:

  1. 属性引用:对象.属性
  2. 实例化
class MyClass:
    """一个简单的类实例"""
    i = 12345
    def f(self):
        return 'hello world'
 
# 实例化类
x = MyClass()
 
# 访问类的属性和方法
print("MyClass 类的属性 i 为:", x.i)
print("MyClass 类的方法 f 输出为:", x.f())
# 输出
MyClass 类的属性 i 为: 12345
MyClass 类的方法 f 输出为: hello world

构造方法:

类中有一个__init__() 方法,在类实例化时(x = MyClass())会自动调用:

def __init__(self):
    self.data = []

和java一样,当没有定义的时候,会自动生成,也可以有参数,进而能传递到类的实例化操作上:

class Complex:
    def __init__(self, realpart, imagpart):
        self.r = realpart
        self.i = imagpart
x = Complex(3.0, -4.5)
print(x.r, x.i)   
# 输出
3.0 -4.5

类方法:

类方法不同于普通函数之处:必须有一个额外的第一个参数名称,通常为self或者this,也可以是任意词。

class Test:
    def prt(self):
        print(self)
        print(self.__class__)
 
t = Test()
t.prt()
# 输出
<__main__.Test instance at 0x100771878>
__main__.Test
  • self代表的是类的实例,表示当前对象的地址,self.class表示类。
#类定义
class people:
    #定义基本属性
    name = ''
    age = 0
    #定义私有属性,私有属性在类外部无法直接进行访问
    __weight = 0
    #定义构造方法
    def __init__(self,n,a,w):
        self.name = n
        self.age = a
        self.__weight = w
    def speak(self):
        print("%s 说: 我 %d 岁,%d kg。" %(self.name,self.age,self.__weight))

# 实例化类
p = people('runoob',10,30)
p.speak()
# 输出
runoob 说: 我 10 岁,30 kg。

继承

子类(派生类 DerivedClassName)会继承父类(基类 BaseClassName)的属性和方法。

单继承

#类定义
class people:
    #定义基本属性
    name = ''
    age = 0
    #定义私有属性,私有属性在类外部无法直接进行访问
    __weight = 0
    #定义构造方法
    def __init__(self,n,a,w):
        self.name = n
        self.age = a
        self.__weight = w
    def speak(self):
        print("%s 说: 我 %d 岁。" %(self.name,self.age))

#单继承示例
class student(people):
    grade = ''
    def __init__(self,n,a,w,g):
        #调用父类的构函
        people.__init__(self,n,a,w)
        self.grade = g
    #覆写父类的方法
    def speak(self):
        print("%s 说: 我 %d 岁了,我在读 %d 年级"%(self.name,self.age,self.grade))

s = student('ken',10,60,3)
s.speak()
# 输出
ken 说: 我 10 岁了,我在读 3 年级

多继承

若父类中有相同方法名,在子类使用时未指定,则从左到右查找父类中是是否包含该方法。

#类定义
class people:
    #定义基本属性
    name = ''
    age = 0
    #定义私有属性,私有属性在类外部无法直接进行访问
    __weight = 0
    #定义构造方法
    def __init__(self,n,a,w):
        self.name = n
        self.age = a
        self.__weight = w
    def speak(self):
        print("%s 说: 我 %d 岁。" %(self.name,self.age))

#单继承示例
class student(people):
    grade = ''
    def __init__(self,n,a,w,g):
        #调用父类的构函
        people.__init__(self,n,a,w)
        self.grade = g
    #覆写父类的方法
    def speak(self):
        print("%s 说: 我 %d 岁了,我在读 %d 年级"%(self.name,self.age,self.grade))

#另一个类,多继承之前的准备
class speaker():
    topic = ''
    name = ''
    def __init__(self,n,t):
        self.name = n
        self.topic = t
    def speak(self):
        print("我叫 %s,我是一个演说家,我演讲的主题是 %s"%(self.name,self.topic))

#多继承
class sample(speaker,student):
    a =''
    def __init__(self,n,a,w,g,t):
        student.__init__(self,n,a,w,g)
        speaker.__init__(self,n,t)

test = sample("Tim",25,80,4,"Python")
test.speak()   #方法名同,默认调用的是在括号中参数位置排前父类的方法
# 输出
我叫 Tim,我是一个演说家,我演讲的主题是 Python

方法重写

super() 函数是用于调用父类(超类)的一个方法。

class Parent:        # 定义父类
   def myMethod(self):
      print ('调用父类方法')

class Child(Parent): # 定义子类
   def myMethod(self):
      print ('调用子类方法')

c = Child()          # 子类实例
c.myMethod()         # 子类调用重写方法
super(Child,c).myMethod() #用子类对象调用父类已被覆盖的方法
# 输出
调用子类方法
调用父类方法

参考:Python 子类继承父类构造函数说明

运算符重载

__str__ 是一个类的方法,在打印类对象,获取其属性信息时调用。打印一个实例化对象时,默认打印的其实时一个对象的地址但是我们可以对其进行重载,打印我们想要的信息

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)
posted @ 2024-02-19 22:44  PamShao  阅读(64)  评论(0编辑  收藏  举报