python面向对象

本文详细介绍了Python面向对象编程的概念,包括类的定义、命名规范、属性类型、对象属性的赋值、`__init__`与`__new__`方法的区别、对象属性的私有化与封装、`str()`方法、公有与私有方法、对象引用计数及内存地址的查看。通过实例展示了如何创建和操作对象,以及如何访问和修改私有属性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.类
类是具有相同属性和方法的对象的集合
class是类名

2.定义一个类:
class Person:
def eat(self):
print(“正在吃饭…”)
def sleep(self):
print(“正在睡觉…”)

3.类的命名
首字母要大写
以大小写分割单词
不使用下划线

4.属性分归属 类属性 对象属性
对象属性的两种创建方式:
self 对象的载体

def init(self,name,age):
self,name=name;
self,age=age;

5.对象名,属性 赋值的形式
init(self,name,age)在创建类的实例的时候,会自动调用这个方法,一般用户对实例属性初始化;
class person:

def__init__(self,name,age):

self.name=name;

self.age=age;

print(“执行init时就被调用了”)
p=person(“tom”,20)
print(p.name)
print(p.age)

  1. new(cls,*agrs,**kwargs)

    在类调用init方法时,new方法决定是否要用init方法,因为new可以调用其他类的方法,或者返回别的对象来

作为本类的实例;

new()方法的特性:

new()方法时在类准备将自身实例化时调用;

new()方法始终都是类的静态方法,即使没有被加上静态方法装饰器;

class A(object):
def init(self,*args,**kwargs):
print( “init 函数的调用”,args[0],args[1])
def new(cls,*args,**kwargs):
print(” new对象的调用“,args[0],args[1])
print(“传入cls的对象实例”,cls)
return object.new(cls,*args,**kwargs)
a=A()

7.对象属性 私有和共有

类属性 公有和私有
对属性进行私有化 __属性,外部访问不到,也不可对属性进行赋值

class Person(object):
def init(self, name):
self.name = name
self.__title = ‘Mr’
self.__job = ‘python’
p = Person(‘Bob’)
print (p.name)
Bob
print (p._title)
Mr
print (p.__job)
python

class Person(object):
def init(self, name):
self.name = name
self._title = ‘Mr’
self.__job = ‘python’
print (p.name)
Bob
print (p._title)
Mr
print (p.__job)
python

8、 封装 2步

(1)把属性变成私有

(2)用set()和get()函数写一个方法

class Person:  
    def __init__(self,name,age):  
        self.name=name  
        self.__age=age  
    def getAge(self):  
        return self.__age  
    def setAge(self, age):  
        if age<0 or age>100:  
            self.__age=18;  
        else:  
            self.__age=age  
    def showtime(self):  
        print("姓名:{}".format())  
p=Person("as",20);  
print(p.getAge())  
p.setAge(10)  
print(p.getAge())  
class Person:  
    def __init__(self,name,age):  
        self.name=name  
        self.__age=age  
    def getAge(self):  
        return self.__age  
    def setAge(self, age):  
        if age<0 or age>100:  
            self.__age=18;  
        else:  
            self.__age=age  
    def showtime(self):  
        print("姓名:{}".format())  
p=Person("as",20);  
print(p.getAge())  
p.setAge(10)  
print(p.getAge())  

9.def str() 一个类的实例变成str,需要用特殊方法str()

class Person(object):  
    def __init__(self, name, gender):  
        self.name = name  
        self.gender = gender  

p = Person('Bob', 'male')  
print (p)  
class Person(object):  
    def __init__(self, name, gender):  
        self.name = name  
        self.gender = gender  

p = Person('Bob', 'male')  
print (p)  
class Person(object):  
    def __init__(self, name, gender):  
        self.name = name  
        self.gender = gender  
    def __str__(self):  
        return '(Person: %s, %s)' % (self.name, self.gender)  
p = Person('Bob', 'male')  
print (p)  
class Person(object):  
    def __init__(self, name, gender):  
        self.name = name  
        self.gender = gender  
    def __str__(self):  
        return '(Person: %s, %s)' % (self.name, self.gender)  
p = Person('Bob', 'male')  
print (p)  

10.公有方法和私有方法;

私有方法在方法前加两个下划线:def __text():
  1. 自动销毁方法:del(): 当对象没有引用的时候,或程序结束的时候,程序自动调用del()
class Person:  
     def __init__(self,name,age):  
         self.name=name  
         self.age=age  
     def __del__(self):  
         print("对象张三被销毁")  
zhangsan=Person("张三",20)  
zhangsan.__del__()  
class Person:  
     def __init__(self,name,age):  
         self.name=name  
         self.age=age  
     def __del__(self):  
         print("对象张三被销毁")  
zhangsan=Person("张三",20)  
zhangsan.__del__()  

12.测试对象有多少次引用

import sys

t=T()

sys.getrefcount(t)返回2  从2开始
import  sys  
class Person:  
    def __init__(self,name,age):  
        self.name=name;  
        self.age=age;  
zhangsan=Person("张三",20)  
print(sys.getrefcount(zhangsan))  
import  sys  
class Person:  
    def __init__(self,name,age):  
        self.name=name;  
        self.age=age;  
zhangsan=Person("张三",20)  
print(sys.getrefcount(zhangsan))  

13.访问私有属性可以通过 对象.类名_属性访问到(不建议用这个方法)

14.id()函数 查看对象的内存地址;

15.类属性:属于类成员,对象共有的;

类方法:cls 表明是 类

              在方法上添加 @classmethod装饰器

              def class_method(cls):

              可以通过类方法调用类属性,也可以通过对象调用类属性;

修改类属性的2种方式:

              1.类名.类属性=... 
              2.实例对象__class__类属性=...

静态方法:前面加@staticmethod,静态方法可以加参数,与类和对象都没有关系,也可以通过类和对象调用;
class Person:  
    def __init__(self,name,age):  
        self.name=name;  
        self.age=age;  

    def showInfo(self):  
        print("姓名{0} 年龄{1}".format(self.name, self.age))  

    @staticmethod  
    def goHome(self,name, by):  
        print(name, "回家...", by)  
这里写代码片

class Person:
def init(self,name,age):
self.name=name;
self.age=age;

def showInfo(self):  
    print("姓名{0} 年龄{1}".format(self.name, self.age))  

@staticmethod  
def goHome(self,name, by):  
    print(name, "回家...", by)  
  1. dir() dir 展示一个类/对象的内部属性和函数;
dir(zhangsan);  
zhangsan.__dir__()  
***课后作业 制作dvd管理系统(仿)***
class dvd:
    def __init__(self,name,price,state):
        self.name=name;
        self.price=price #单价 10元/天
        self.state=state # 状态
        return (self.name,self.price,self.state)

class DVDManager: # 查询 增加借出 归还 退出
    #存储 多个dvds 每一个元素 都是一个DVD
    dvds = [['中国五千年', 10, 1],["python",20,1],["孔子",30,1],["隋唐演义",50,1]]
    # print(dvds)
    flag=True
    def Menu(self):
        # # DVDManager.flag
        # print(DVDManager.flag)
        while DVDManager.flag:
            print("=======dvd管理系统=========")
            print('1.查询所有DVD')
            print('2.增加DVD')
            print('3.借出DVD')
            print('4.归还DVD')
            print('5.退出')
            print("============================")
            number =int(input("请输入对应的状态编号:"))
            while True:
                if number in range(1, 6):
                    break
                else:
                    number = int(input("输入错误,请重新输入!"))
            if number == 1: #查看dvd全体成员
                for i in DVDManager.dvds:
                    print(i)
            elif number==2:#增加dvd
                name = input("请输入dvd名字:")
                price = float(input("请输入dvd单价:"))
                state = int(input("请输入dvd状态:"))
                am = [name, price, state]
                # print(type(am))
                DVDManager.dvds.append(am)
                print(DVDManager.dvds)
            elif number == 3:# 借出DVD 即是删除一个书所在的列表
                name = input("请输入借出dvd名字:")#应为是二维的列表 所以要双重遍历
                for i in DVDManager.dvds:
                    if(i[0]==name):
                        i[2] =0
                        break
            elif number == 4:
                name = input("请输入归还dvd名字:")#应为是二维的列表 所以要双重遍历
                for i in DVDManager.dvds:
                    if(i[0]==name):
                        i[2] =1
                        break
            elif number == 5:
                DVDManager.flag = False;

div=DVDManager()
div.Menu()
#退出好像不是很完美???
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值