初识面向对象一

python中一切皆对象
# 类 : 具有相同属性和方法的一类事务
# 描述一类事务轮廓的一个机制
# 商品/用户/店铺
# 对象/实例 :对象(实例)就是类的实例化
# 对象就是类的一个具体的表现
# 某一件特定的商品/某个人/某一家店
# 实例化 : 类 --> 对象
# 实例化的过程:
# 1.创建一个属于对象的空间
# 2.执行__init__,把这个空间传递给init的第一个参数
# 3.把这个空间地址作为返回值返回给对象变量
# 如何定义一个类
# class Cls:pass
# 在类中直接可以定义的内容:
# 静态属性 : 这个类拥有的,所有的对象都共享的属性
# 动态属性 : 方法\定义在类中的函数,描述的是所有对象共享的行为
# 类名的作用:
# 实例化的时候 对象 = 类名()
# 操作静态属性
# 对象名的作用:
# 操作对象的属性
# 调用方法
类中代码的执行顺序
# 一个类可不可以没有__init__? 可以
# 在没有__init__的情况下,实例化经历了哪些步骤???
# 1.创建一个空间给对象
# 2.将这个空间的地址返回

# class A:
# Country = 'China'
# def __init__(self,name):
# self.name = name
# def talk(self):
# print('%s is talking'%self.name)
# 类中的代码是在什么时候执行的? 在实例化之前
# 类的命名空间中有什么:
# 静态属性
# 动态属性(方法)

# 对象的命名空间和类的命名空间之间的关系 :
# 对象和类之间有一个单向的联系,类对象指针
# 对象在使用某个名字的时候,如果在自己的空间中没有找到,就要到类的空间中去找
# class A:
# Country = 'China'
# def __init__(self,name):
# self.name = name
# def talk(self):
# print('%s is talking'%self.name)
#
# asd= A('asd') 在实例化的过程中,又开辟了属于对象的一块空间

# 对象可以查看类的静态属性,但是不能修改
# 并且一旦修改,就不能取到类当中的内容了(除非手动删除这个修改的属性)

# 所有的静态属性的修改,都应该由类名来完成,而不应该使用对象名来完成

# 写一个类,能够记录这个类有多少个对象了(每一次实例化都能够被记录下来)
# class A:
# count = 0
# def __init__(self):
# A.count += 1
# print(A.count)
# a = A()
# print(A.count)
#
# class A:
# count = 0
# def __init__(self):
# self.counter()
# def counter(self):
# A.count+=1
# a = A()
# 如果静态变量是一个不可变数据类型,那么只要对象修改这个数据,就相当于在对象的空间中新建
# 如果静态变量是一个可变数据类型,那么对象修改这个容器中的元素,相当于修改类的空间中的元素
# 如果静态变量是一个可变数据类型,那么对象直接对这个变量重新赋值,相当于修改对象自己空间中的元素

# 大结论
# 只要是静态变量,就用类名去修改,永远修改成功,并且所有的对象都共享这个改变


# 总结
# 对象的命名空间:类指针\对象的所有属性
# 类的命名空间:方法和(静态属性\字段)
# 对象在寻找名字的时候 : 先找对象自己内存空间中的,找不到就去类的命名空间中寻找
# 类中的名字是什么时候写入内存的 : 代码从上到下执行的时候就已经写入的.一定是在实例化之前
# 静态变量 : 尽量用类名去操作

组合
计算圆跟环形的周长面积
from math import pi
class Circle:
def __init__(self,r):
self.r = r

def area(self):
return pi*self.r**2

def perimeter(self):
return 2*pi*self.r

class Ring:
def __init__(self,outer_r,inner_r):
c1 = Circle(outer_r)
c2 = Circle(inner_r)
self.out_c = c1 # c1.area() self.out_c.area()
self.in_c = c2 # c2.area() self.in_c.area()

def area(self):
return self.out_c.area() - self.in_c.area()

def perimeter(self):
return self.out_c.perimeter() + self.in_c.perimeter()

r1 = Ring(10,5)
print(r1.area())
print(r1.perimeter())


 


 

猜你喜欢

转载自www.cnblogs.com/Godisgirl/p/10013928.html