鱼C论坛

 找回密码
 立即注册
查看: 2365|回复: 0

[原创] python 中的类

[复制链接]
发表于 2018-1-26 00:17:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
学习python必须面对的一个问题就是面向对象编程,面向对象编程必须学会定义类。什么是类呢?

1.让我们来定义一个餐厅类。
class Restrant():
    """
   this is a restrant
    """
    def __init__(self,name,d_type):
        self.name=name
        self.d_type=d_type
    def describe_restrant(self):
        print(self.name,self.d_type)
    def open_restrant(self):
        print(self.name,'is running')
这样一个类就被创建了,类中定义的函数称为方法。这个类有两个方法:餐厅的基本描述(名字和类型)和餐厅正在营业。
2.访问属性。

创建实例对象。比如:我们的餐厅叫小明,是中餐餐厅
r=Restrant('xiaoming','chinese')
r.name
r.d_type
结果:
'xiaoming'
'chinese'
3.调用方法。

r=Restrant('xiaoming','chinese')
#可以用变量去接收类的对象。
r.describe_restrant()
r.open_restrant()
结果:
xiaoming chinese
xiaoming is running

4.python 的内置类属性。
__name__ 类的名字
__doc__   类的doc文档
__module__类所在的模块
__dict__ 类的信息,以字典的方式展示
__base__ 类的所有父类构成的元素。
print(Restrant.__name__)
print(Restrant.__doc__)
print(Restrant.__module__)
print(Restrant.__dict__)
print(Restrant.__base__)
结果:
Restrant

   this is a restrant
   
__main__
{'__module__': '__main__', '__doc__': '\n   this is a restrant\n    ', '__init__': <function Restrant.__init__ at 0x000000000AFBAD08>, 'describe_restrant': <function Restrant.describe_restrant at 0x000000000AFBAD90>, 'open_restrant': <function Restrant.open_restrant at 0x000000000AFBAE18>, '__dict__': <attribute '__dict__' of 'Restrant' objects>, '__weakref__': <attribute '__weakref__' of 'Restrant' objects>}
<class 'object'>

5.修改属性的值。
我们可以通过三种方法修改:直接通过实例进行修改;通过方法进行设置;通过方法进行递增(增加特定的值)
定义一个汽车类,并添加默认属性。
class Car():
    """"""
    def __init__(self,make,model,year):
        self.make=make
        self.model=model
        self.year=year
        self.odometer_reading = 0
    def g_d_name(self):
        long_name=str(self.year)+' '+self.model+' '+self.make
        return long_name.title()

my_new_car = Car('audi', 'a4', 2016)
print(my_new_car.g_d_name())
my_new_car.read_odometer()

2016 A4 Audi
This car has 0 miles on it.
   
5.1 直接通过实例进行修改。
my_new_car.odometer_reading = 23
my_new_car.read_odometer()

This car has 23 miles on it.

5.2通过方法修改属性的值。

class Car():
    """"""
......
def update_odometer(self, mileage):
        """将里程表读数设置为指定的值"""
        self.odometer_reading = mileage

my_new_car.update_odometer(23)
my_new_car.read_odometer()
This car has 23 miles on it.

5.3通过方法对属性的值进行递增

class Car():
    """"""
......
    def increment_odometer(self, miles):
           """将里程表读数增加指定的量"""
           self.odometer_reading += miles

my_used_car = Car('subaru', 'outback', 2013)
print(my_used_car.g_d_name())
my_used_car.update_odometer(23500)
my_used_car.read_odometer()
my_used_car.increment_odometer(100)
my_used_car.read_odometer()

2013 Outback Subaru
This car has 23500 miles on it.
This car has 23600 miles on it.   
   
6.类的继承。

class Car():
    """"""
    def __init__(self,make,model,year):
        self.make=make
        self.model=model
        self.year=year
    def g_d_name(self):
        long_name=str(self.year)+' '+self.model+' '+self.make
        return long_name.title()
   
class ElectricCar(Car):
    """电动汽车的独特之处"""
    def __init__(self, make, model, year):  #方法__init__() 接受创建Car 实例所需的信息
        """初始化父类的属性"""
        super().__init__(make, model, year)
               
my_tesla = ElectricCar('tesla', 'model s', 2016)
print(my_tesla.g_d_name())
2016 Model S Tesla

现在让我们看的更清楚一些:
class Parents():
    def __init__(self):
        print('调用父类的构造函数')
    def parensMthods(self):
        print('调用父类的方法')
class Child(Parents):
    def __init__(self):
        print('调用子类的构造函数')
    def chileMthods(self):
        print('调子父类的方法')

p2=Child()
p2.parensMthods()
调用父类的方法
由此可见,子类可以调用父类的构造方法。但是python不会自己去调用。可以加上 super().__init__()就会自动调用父类的方法。
class Parents():
    def __init__(self):
        print('调用父类的构造函数')
    def parensMthods(self):
        print('调用父类的方法')
class Child(Parents):
    def __init__(self):
        super().__init__()
        print('调用子类的构造函数')
    def childMthods(self):
        print('调子父类的方法')

p2=Child()
调用父类的构造函数
调用子类的构造函数

7.子类的重写。

class Parents():
    def __init__(self):
        print('调用父类的构造函数')
    def parensMthods(self):
        print('调用父类的方法')
    def say(self):
        print('hello world')
class Child(Parents):
    def __init__(self):
        super().__init__()
        print('调用子类的构造函数')
    def childMthods(self):
        print('调子父类的方法')
    def say(self):
        print('hello 小甲鱼')

p2=Child()
p2.say()
结果:hello 小甲鱼
再看这个:
p1=Parents()
p1.say()
结果:hello world
我们看到父类和子类中都有say()这个函数,在子类中运行的是自己定义的函数,不同于父类。

8.类的私有属性。
_private_attrs:两个下划线开头,声明该属性为私有,不能在类地外部被使用或直接访问。
在类内部的方法中使用时  self.__private_attrs。
class Parents():
    __name='小甲鱼'
    def __init__(self):
        print('调用父类的构造函数')
    def parensMthods(self):
        print('调用父类的方法')

我们没有办法调用到__name ,因为这是类私有的,要想调用,可以加一个方法。比如:
class Parents():
    __name='小甲鱼'
    def __init__(self):
        print('调用父类的构造函数')
    def parensMthods(self):
        print('调用父类的方法')
    def showName(self):
        print(self.__name)

p=Parents()
p.showName()
结果:小甲鱼
我们加了一个showName方法,那就可以调用了。
如果你觉得定义函数太麻烦,还有一种简单的访问私有变量的方法:
p._Parents__name
结果:小甲鱼

好了,以上就是我学习类的笔记。








  

类的简介

类的简介
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 16:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表