类与对象------day22

类与对象

想要调用类就要先定义(类名要按照大坨峰体来书写,每个单词的首字母大写)
在类中描述对象
class Person:
# 用变量来描述特征
name = "李四"
sex = "man"
age = 20
得到对象 通过调用类,也称之为实例化 或 创建对象
obj = Person()
print(obj)
模块名为main 其包含一个Person类 通过Person类产生了一个对象 地址为0x00000279452B7C50

使用对象的属性(说的就是特征)
print(obj.name)
在应用类时吧相同属性的放到类中

stu1 = Student()----创建两个对象
stu2 = Student()

print(stu1)----输出内存地址
print(stu2)
每个对象的内存地址是不一样的,在创建对象时,计算机会申请一个新的内存空间,并将对象中的内容存进去

print(id(stu1.name))
print(id(stu2.name))
由于name的值声明在类中,所以每个对象使用的都是同一份

----为对象单独定制属性-----修改类中的属性
stu1.name="要修改的内容"
stu2.name="要修改的内容"

每个对象的name属性都不同,则意味着需要给每一个对象指定单独的name

---------------------------------------------------------
存储属性的位置有两个 一个是类中,还有一个在对象中
当每个对象的某个特征都相同时则放到类中
当某个对象的某个属性都不相同时则放到对象中

修改类中的属性
stu1.age = 30
通过__dict__可以获得一个对象中包含的内容
print(stu1.__dict__)----第一个人的age会被改为30

属性的访问顺序:如果对象中有 优先访问对象中的,如果没有在访问类中的
# 查找顺序为 对象 -> 类

当创建一个类时,会产生名称空间,存储在类中的名称和值有是绑定关系
当创建一个对象时,会产生名称空间,存储对象中名称和值是绑定关系
另外还有一种作用,就是作为对象的模板,所有属于同一类的对象,都具备类中的公共内容

即使我们什么否没有写类中也存在自带的属性,是从父类得到的继承

创建一个对象用函数来创建,设置他的属性
class Student:

# 定义一个函数 用于为对象设置属性
def set_attr(obj, name, sex, age):
obj.name = name
obj.sex = sex
obj.age = age
pass
set_attr这个函数目的是用于设置对象的属性,如果没有对象则该函数没有存在的意义,也就是初始函数应该与类时一个整体应该将这个函数放到类中
stu1 = Student()
# 指定属性
stu1.name = "张无忌"
stu1.sex = "man"
stu1.age = 18


stu3 = Student()----这样就可以调用这个函数了
stu4 = Student()

Student.set_attr(stu3,"金毛狮王","man",80)----给函数传值
print(stu3.__dict__)
Student.set_attr(stu4,"张全蛋","man",28)----给函数传值
print(stu4.__dict__)
对象的创建和初始化步骤是分开的, 通常对象一旦创建 就应该进行初始化,所以最好是将创建与初始化进绑定
为什么要绑定:绑定后就是把调用函数编程了调用对象
绑定方法:
就是将数据与处理数据的函数绑定在一块

使用方法:
class Student:
school = "BeiJing"
def __init__(self,name,sex,age):接收传入的值赋给赋值者
self.name = name
self.sex = sex
self.age = age
def learning(self):
print("正在学习..")
def sayHI(self):
print("hello my name is %s my age:%s my sex:%s" % (self.name,self.age,self.sex))
默认情况下,在类中定义的函数都是绑定方法,共同点是,都会将对象作为第一个参数 self
# 当用用对象来调用类中的方法时,默认把对象传入方法中
# 而用类名来调用时,则需要手动传入对象

print(stu1.sayHI)
#<bound method Student.sayHI of <__main__.Student object at 0x000001784F889C50>>
# 这是一个绑定方法,本质上是Student类中的sayHI函数 现在把这个函数绑定给了地址为0x000001784F889C50的对象

stu2 = Student("李四","女",19)
stu2.sayHI()
print(stu2.sayHI)

------只要拿到对象 就同事拿到了数据和处理数据的方法------

# 第一个问题传递参数,必须手动传递,很有可能传参顺序而发生错误
# 第二个问题每次处理数据 都需要手动传参数
# 第三个问题 当要处理的数据特别的多 就不能再定义为变量了 你可以使用列表出来存储要处理的数据
# 但是 每次处理 都需要先获取数据 在传递给处理数据的函数
# 所以将 要处理的数据与 处理数据的函数进行绑定

# 如何绑定? 就得用对象了

绑定分为两种,一种是绑定给对象,一种是绑定给类
绑定给类的,使用一个装饰器叫classmethod,必须有一个参数,表示当前类,参数名也可以自己定义,建又要该
---------------------------------------------------------
class Student:
school = "beijing"

def __init__(self,name,age,sex):
self.name = name
self.age = age
self.sex = sex

-----这是绑定给类的方法
@classmethod
def print_school(cls): # 输出类里面叫school的属性
print(cls.school) #cls.school调用了类里面的公共属性
类的绑定方法,对象和类都能调用,并且都会自动传入这个类
使用方法:---用类名来调用---Student.print_school()
使用方法:---用对象来调用---stu1 = Student("印度阿三","woman",20)
--------------stu1.print_school()

-----这是绑定给对象的方法
def sayHello(self):
print(self.name, " 说: 你好")
使用方法:---用类名来调用---Student.sayHello(Student("印度阿三","woman",20))
使用方法:---用对象来调用---stu1=Student("印度阿三","woman",20)---stu1就是对象,在调用时必须传参
--------------stu1.sayHello()
对象绑定方法 可以使用对象来调用,也可以使用类名来调用
在对象调用时会自动传入对象自己
类调用时不会自动传参
用=就是使用一个对象来传参就是用对象来调用
直接写函数名就是用类来调用
----------------------------------------------------------
# 一个方法到底应该绑定给对象还是帮对给类?<><><>
# 当要处理的数据包含在类中时,就应该绑定给类
# 当要处理的数据包含在对象中时,就应该绑定给对象

# 类的绑定方法和对象的绑定方法的相同与不同
相同点:
1.都会自动传值
2.都可以被类和对象调用

不同点:
1.对象绑定方法再对象调用时 传的是对象自己 而类绑定方法字自动传的是类自己
2.第一个参数 个cls 一个叫self


为什么要绑定?

# 第一个问题传递参数,必须手动传递,很有可能传参顺序而发生错误
# 第二个问题每次处理数据 都需要手动传参数
# 第三个问题 当要处理的数据特别的多 就不能再定义为变量了 你可以使用列表出来存储要处理的数据
但是 每次处理 都需要先获取数据 在传递给处理数据的函数
之所以绑定 ,简化代码,提高效率
---------------------------------------------------------------
非绑定方法
class Teacher:

def __init__(self,name,sex):
self.name = name
self.sex = sex

# ------------@staticmethod 用于定义个非绑定方法
@staticmethod
def test_func(num):
print("test_func run!")
print(num)

Teacher.test_func(1)

t1 = Teacher("矮根","男")
t1.test_func(100)
print(t1.test_func)

# 什么是非绑定方法 再类中 即不绑定给类 也不绑定给对象
# 特点:没有自动传参数的效果 ,类和对象向都能调用,就是一个普通函数
# 当你的这个功能不需要访问类的数据 也不需要访问对象的数据,就可以作为一个非绑定方法
# 使用场景较少

posted @ 2018-12-13 19:29  WenChen-0o0  阅读(104)  评论(0编辑  收藏  举报