对象和类的相关概念
- 类
类:是对一群具有相同特征或者行为的事物的统称,是抽象的,不能直接使用。
例如 人类,狗类,猫类…
描述一个类通过静态的属性和动态的行为
属性:黄毛,大眼睛
行为:会跑,会叫
类可以理解为一种事物的模板
- 对象
对象:是由类创造出来的具体实体,可以直接使用。例如 大黄,小白。
类和对象之间的关系
1.先有类后有对象
2.类只有一个,而对象可以有多个
类的设计
在程序中设计一个类,通常需要满足以下3个要素:
类名:大驼峰命名法 即类名的首字母大写
属性:描述这类事物的特征。
方法:描述这类事物的具体行为。
class Student():
name = ''
def study(self):
print('{}要去学习了'.format(self.name))
def eat(self):
print('{}要去吃饭了'.format(self.name))
# 创建一个实例化对象
zs = Student() # 对象 = 类名()
zs.name = '张三'
zs.study() # 调用类里面的方法 对象名.方法名()
zs.eat()
- self 变量
查看self和 对象的内存id值是否相同
class Human():
def eat(self):
print('人在吃饭',id(self))
zs = Human()
zs.eat()
print(id(zs))
ls = Human()
ls.eat()
print(id(ls))
self:哪个对象调用方法或者属性,self就是哪个变量
__init__方法
init()内置方法在创建对象的时候自动执行。
class Student():
def __init__(self,name,age,sex):
self.name = name
self.age = age
self.sex = sex
def show(self):
print('我叫{}年龄{}性别{}'.format(self.name,self.age,self.sex))
zs = Student('张三',18,'男')# 这行代码执行结束后,系统自动调用__init__()方法,__init__()方法执行结束后,再继续执行下一行代码
zs.show()
我们可以在__init__()中做一些初始化操作。
class Cat():
def __init__(self):
print('我是初始化方法')
self.name = 'tom'
cat = Cat()
# 我是初始化方法 -->运行结果 (不是注释)
print(cat.name) # tom
cat2 = Cat()
# 我是初始化方法
print(cat2.name) # tom
利用参数设置初始值
在调用__init__():方法的时候进行初始值的设置
格式:init(self,arg1,arg2…)
对象调用时:dog = Dog(‘aa’,‘bb’,…)
实参和形参一一对应,定义了几个形参就要传递几个实参。
- 在类的外部添加属性
方式:对象名.属性名 = 值
注意:这种方式虽然简单,但是不推荐使用。
class Person():
def eat(self):
print('吃...')
print(self.name)
per = Person()
per.name = '张三'
per.eat()
# 不推荐使用
per1 = Person()
# 不添加name属性,但是调用eat()方法就会报错
per1.eat() # AttributeError: 'Person' object has no attribute 'name'
str()
如果一个类没有__str__()方法,就会调用父类中的__str__()方法,父类中的__str__()方法默认返回的是对象的内存地址,所以如果我们想要打印对象保存的信息的时候,就需要重写__str__()方法
class Dog():
def __init__(self,color,age):
self.color = color
self.age = age
def __str__(self):
return '颜色%s 年龄%d'%(self.color,self.age)
d = Dog('红色',18)
print(d) # 颜色红色 年龄18
# 如果狗类中没有__str__()方法,print(d)的时候默认返回的是对象d的内存地址
类属性和实例属性
实例属性:在实例对象中定义的属性
类属性(静态属性):
在类对象(也就是类)中定义的属性,并且多个实例对象之间共享一份类属性。
类属性的使用方式:
类名.类属性
也可以使用 对象名.类属性
# 类属性为不可修改类型时:
class People():
tax = 0.09 # 类属性
def __init__(self,salary):
self.salary = salary
def jiaoshui(self): # 行为
return self.salary*self.tax
a = People(100000)
b = People(200000)
# print(People.tax) # 类名.类属性
# print(a.tax) # 对象名.类属性
# print(b.tax)
# a.tax = 0.08
# print(a.tax)
# print(b.tax)
# print(People.tax)
print(id(a.tax))
print(id(People.tax))
a.tax += 0.01
print('%.2f'%a.tax,id(a.tax))
print(People.tax,id(People.tax))
# 类属性为可修改类型时:
class A():
books = ['三国','西游记']
def __init__(self,name):
self.name = name
x = A('张三')
y = A('李四')
x.books[0] = '水浒传'
# print(y.books)
# print(A.books)
x.books = ['红楼梦','大秦帝国']
print(x.books)
print(y.books)
print(A.books)