一、类的定义和使用

#!/usr/bin/python
#coding=utf-8

#定义类
class Stock:
    def __init__(self, stockCode, price):
        self.stockCode, self.price = stockCode, price
    def get_stockCode(self):
        return self.stockCode
    def set_stockCode(self, stockCode):
        self.stockCode = stockCode
    def get_price(self):
        return self.price
    def set_price(self, price):
        self.price = price
    def display(self):
        print("Stock code is:{}, price is{}.".format(self.stockCode, self.price))

#使用类
myStock = Stock("12580", 100)
myStock.display()

myStock.set_stockCode("123456")
print(myStock.get_stockCode())

myStock.set_price(200)
print(myStock.get_price())
笔记:
1、self是指自身类,这里即是指Stock类,比如在上面的init方法中,是用self.stockCode, self.price=stockCode, price的方法,用参数传入的stockCode和price给类的对应属性赋值。

测试运行:
在这里插入图片描述

二、魔术方法

在开头和结尾都是两个下划线的方法叫做魔术方法,它们会在特定的时间点被自动触发。

#!/usr/bin/python
#coding=utf-8

#定义类
class Stock:
    def __init__(self, stockCode):
        print("__init__")
        self.stockCode = stockCode
    #回收类的时候被触发
    def __del__(self):
        print("__del__")
    def __str__(self):
        print("__str__")
        return "stockCode is: " + self.stockCode
    def __repr__(self):
        print("__repr__")
        return "##stockCode is: " + self.stockCode
    def __setattr__(self, name, Value):
        print("__setattr__")
        self.__dict__[name] = Value     #给类中的属性名分配值
    def __getattr__(self, key):
        print("__getattr__")
        if key == "stockCode":
            return self.stockCode
        else:
            print("Class has no attribute '%s'" % key)
            
myStock = Stock("12580")    #触发__init__和__setattr__方法
print(myStock)              #触发__str__方法
myStock.stockCode = "123456" #触发__setattr__方法
笔记:
1、__del__方法有点像析构函数,在类被回收时触发。
2、__str__和__repr__方法一般会配套使用。上面代码中 ***print(myStock)*** 会调用__str__方法,如果注释掉__str__方法,则会调用__repr__方法(这是本人亲测的效果,但本人手中的书写——如果不写__str__方法,运行时会报错。望大神能解惑下)3、__setattr__和__getattr__方法分别会在设置和获取属性时被触发。

测试运行:
在这里插入图片描述

三、对外屏蔽类中的不可见方法

#!/usr/bin/python
#coding=utf-8

#定义类
class Car:
    def __init__(self, owner, area):
        self.owner = owner
        self.__area = area
    def __engineStart(self):
        print("Engine Start")
    def start(self):
        print("Start Car")
        self.__engineStart()
    def get_area(self):
        return self.__area
    def set_area(self, area):
        self.__area = area

myCar = Car("Nichlas", "shenzhen")
print(myCar.owner)
print(myCar.get_area())
myCar.set_area("zhanjiang")
print(myCar.get_area())
print(myCar.start())
笔记:
1、像_xx这样以单下划线开头的是protected类型的变量和方法;像__xx这样以双下划线表示的是private类型的变量和方法。它们都只能在本类中被调用。

测试运行:
在这里插入图片描述

四、类方法和静态方法

#!/usr/bin/python
#coding=utf-8

#定义类
class CalculateTool:
    __PI = 3.14
    @staticmethod
    def add(x, y):
        __result = x + y
        print(x + y)
    @classmethod
    def calCircle(self, r):
        print(self.__PI * r * r)
        
CalculateTool.add(20, 30)
CalculateTool.calCircle(1)

#不建议通过对象访问类方法和静态方法
tool = CalculateTool()
tool.add(10, 20)
tool.calCircle(2)
笔记:
1、不需要实例化对象就可以初始化类方法和静态方法。
2、类方法的第一个参数必须是指向本身的引用,而静态方法可以没有任何参数。
3、上面代码中**add**方法前加了**@staticmethod**注解,用来说明这个方法是静态方法;**calCircle**方法前加**@classmethod**注解,说明这个方法是类方法。
4、静态方法和类方法会破坏类的封装性,使用时需谨慎。

测试运行:
在这里插入图片描述

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐