python--类的创建和使用

创建Dog类

class Dog():
    def __init__(self,name,age):
        """初始化name和age"""
        self.name = name
        self.age = age
        self.kind = "dog"	#设置默认值
        
    def sit(self):
        """模拟坐下"""
        print(self.name,"is sitting now.")
        
    def roll(self):
        """模拟打滚"""
        print(self.name,"is rolling now")

1、类定义中只有方法定义,并没有java中的成员变量,实际上init()方法中声明的变量就是成员变量,在python中称为属性
2、类中每个属性都必须有初始值,即使是0、空字符串,在init()中设置默认值,不能像函数定义时给参数设置默认值一样,必须要在函数体内设置

class Dog():
    def __init__(self,name,age,kind="dog"):		#这里是直接在参数处赋默认值
        """初始化name和age"""
        self.name = name
        self.age = age
        
    def sit(self):
        """模拟坐下"""
        print(self.name,"is sitting now.")
        
    def roll(self):
        """模拟打滚"""
        print(self.name,"is rolling now")
doggy =Dog("gougou",5)
print(doggy.kind)	#不可访问,原因是Dog对象没有kind属性

上例仔细想想,其实参数处赋默认值只是给kind变量一个默认值,但是属性是要在init()方法内部声明的才是,这个kind有了默认值但是后面并没有使用,如果在init()内部写上self.kind = kind就行了
2、类定义中的每个函数第一个参数都是self。
2、方法init()创建一个特定小狗的实例,并使用输入的参数来设置属性name和age,虽然init()并没有显示的返回值,但是它会返回一个Dog类的实例,而不是None。
3、首字母大写的名称通常被认为是类名,小写的则是实例名。

实例化

doggy = Dog("gougou",5)
doggy.sit()
doggy.roll()
print(doggy.age)
doggy.age += 1
print(doggy.age)
#结果
gougou is sitting now.
gougou is rolling now
5
6

实例名.属性名     访问实例的属性值,可以使用其值,也可以进行修改。但是不建议直接在外面修改属性值,应当创建方法对属性进行修改。
实例名.方法名(参数)  调用实例的方法

但是我有个问题,python怎么限制函数调用时传递参数的类型呢?不会是等到报错的时候再提示吧,那时候如果值是被传递到别的变量然后报的错,那岂不是还得溯源再?

继承

子类默认继承父类的所有的属性和方法,同时可以定义自己的属性和方法。

class Car():
    def __init__(self,name):
        self.name = name
    def run(self):
        print(self.name," is running,haha")
        
class ElectricCar(Car):
    def __init__(self,name,electricity):
        super().__init__(name)
        self.electricity = electricity
    def run(self):		#父类方法重写
    	print("The electrical car ",self.name," is runing")

elecar = ElectricCar("BYD",100)
elecar.run()
#The electrical car  BYD  is runing
print(elecar.electricity)
#100

注意点:
1、子类的init()方法中调用父类的init()方法**super().__init()__(参数)**别直接写super.__init__()
2、子类继承父类的写法class EletricCar(Car),把父类写在括号里,以示继承。
3、父类方法重写
4、可以使用类的实例作为属性

导入类

好比前面写的Car类和ElectricCar类都在car.py文件(模块)中,现在我们在同级目录有些了一个exercise.py文件(模块),并且向创建一个Car类的实例,那么

from  文件名 import  类名
或者直接导入整个文件中的所有类
import 文件名

from car import Car	#只导入Car类
my_car = Car("tesla")

import car#导入了car文件中的Car和ElectricCar

如果说,Car和ElecctricCar不在同一个模块(文件)中,前者在car模块。后者在electric模块,现在你需要实例化一个电动汽车对象,那么你除了需要导入电动汽车模块,还需要导入汽车模块(尽管电动车模块中肯定也导入了汽车模块)

最后课本提了一个collections库里面有一个OrderedDict,说这个类实例化的对象是一个字典,但是这个字典时有序的,遍历的时候会按照插入值的顺序遍历,(因为之前说字典是没有顺序的,但实际上python3.6之后就默认是有顺序的了),但还是用一下这个吧。

from collections import OrderedDict
dic = OrderedDict()
dic["Alice"] = 12
dic["Cindy"] = 34
dic["Bob"] = 23
dic["Alice"] = 100
for m,n in dic.items():
    print(m,n)
Alice 100
Cindy 34
Bob 23   

OrderedDict内部维护着一个根据键的插入顺序排序的双向链表,每次当一个新的元素插入进来,它会被放到链表的尾部,对于一个已存在的键重复复制不会改变它的顺序。
最后用普通字典试了一下,结果和这个一模一样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值