python面向对象编程二

本文详细介绍了Python面向对象编程中的属性和方法,包括构造函数、析构函数、私有属性与方法的约定,以及类变量的使用。讨论了如何访问私有属性,解释了Python的垃圾回收机制,并探讨了类的内置方法如`__getattribute__()`、`__setattr__()`。文章还展示了动态添加和修改类方法的示例,并给出了整数集合类的设计例子。
摘要由CSDN通过智能技术生成

三、属性和方法

类由成员变量(对应于对象的属性)和成员函数(对应于对象的方法)组成。属性是对数据的封装,方法则表示对象具有的行为。

Python的构造函数、析构函数、私有属性或方法都是通过名称约定区分的。

此外,Python还提供了一些有用的内置方法,简化了类的实现

1、类的成员属性

Python的类的成员一般分为私有属性和公有属性,像C++有定义属性的关键字(publicprivateprotect),而Python没有这类关键字,默认情况下所有的属性都是“公有的”,对公有属性的访问没有任何限制,且都会被子类继承,也能从子类中进行访问。

若不希望类中的成员在类外被直接访问,就要定义为私有属性。Python使用约定属性名称来划分属性类型。若属性的名字以两个下划线开始,表示私有属性;反之,没有使用双下划线开始的表示公有属性。类的成员变量及成员函数都同样使用这个约定。

另外,Python没有保护类型的修饰符。

Python的实例变量变量:

实例变量是以self为前缀的成员变量,没有该前缀的成员变量是普通的局部变量。

C++中有一类特殊的属性称为静态变量。静态变量能被实例化对象调用,还可以被类直接调用。当创建新的实例化对象后,静态变量并不会获取新的内存空间,而是使用类创建的内存空间。因此,静态变量能够被多个实例化对象共享。

Python中静态变量称为类变量,类变量可以在该类的所有实例中被共享。

 

关于Python私有属性的访问:

 

类的外部不能直接访问私有属性。

Python提供了直接访问私有属性的方式,可用于程序的测试和调试。

私有属性访问的格式:

   instance._classname__attribute

说明:

instance表示实例化对象;

classname表示类名;

attibute表示私有属性

注意:classname之前是单下划线,attribute之前是双下划线

class Fruit:
    def __init__(self,color):
        self.__color=color #定义私有变量;
        
if __name__=="__main__":
    apple=Fruit('red') #创建实例对象
    print(apple._Fruit__color) #调用类的私有变量;
        

输出结果:red

 

# -*- coding: utf-8 -*-
"""
Spyder Editor

This is a temporary script file.
"""

class Fruit(object):
    price=0    #定义类类变量
    
    def __init__(self,color):
        self.__color=color #定义私有变量;
    
    def getColor(self):
        print(self.__color) #输出私有变量
        
    @staticmethod  #使用@staticmethod修饰器定义静态方法    
    def getPrice():
        print(Fruit.price)
        
    def __getPrice():  #定义私有方法
        Fruit.price=Fruit.price+10
        print(Fruit.price)
        
    count=staticmethod(__getPrice)  #使用staticmethod 方法定义静态方法
    
    
if __name__=="__main__":
    apple=Fruit('red') #创建实例对象
    apple.getPrice() #使用实例调用方法
    Fruit.count() #使用类名调用静态方法
    banana=Fruit('yellow')
    Fruit.getPrice()
    Fruit.count()
        

 输出方法:

0
10
10
20

#构造函数应用一
class Person(object):
    def __init__(self,name='',age=0):
        self.name=name
        self.age=age
    def __str__(self):
        return "Person('%s','%d')" % (self.name,self.age)
    
    
if __name__=="__main__":
    p=Person('Jack',25)
    print(p)
    p=Person()  #可以创建空对象
    print(p)

输出结果为:

Person('Jack','25')
Person('','0')

 

#构造函数应用二
class Fruit(object):
    def __init__(self,color):
        self.__color=color
        
    def getColor(self):
        print(self.__color)
        
    def setColor(self,color):
        if color in ('red','black','white','gray','blue'):
            self.__color=color
            
     
    
if __name__=="__main__":
    color='red'
 
    fruit=Fruit(color)
    fruit.getColor()
    fruit.setColor('blue')
    fruit.getColor()
    fruit.setColor('yellow')
    fruit.getColor()
    fruit.setColor('white')
    fruit.getColor()
    <
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值